zoukankan      html  css  js  c++  java
  • Java中String、StringBuilder和StringBuffer源码分析及区别详解

    String、StringBuilder和StringBuffer是我们在写代码的过程中经常使用到,之前只是使用,没有深入的了解这三个的底层原理以及区别,以下是自己在学习jdk源码过程对这三个理解。

    一.String、StringBuilder和StringBuffer三者的区别

    1.String字符串常量:在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间,列如:初始String值为“hello”,然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了“hello world”字符串也相应的需要开辟内存空间,短短的两个字符串,却需要开辟三次内存空间。

    2.StringBuffer、StringBuilder都属于字符串变量:都可以对字符串进行修改,不会产生新的未使用对象。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuffer是线程安全的,被synchronized修饰符所修饰,速度慢,StringBuilder不是线程安全的,速度快,在日常能够使用中,如果没有要求线程安全,建议使用StringBuilder。

    3.String、StringBuilder和StringBuffer执行速度由高到低:StringBuilder>StringBuffer>String

    二.String、StringBuilder和StringBuffer三者的源码分析

    1.String源码

    //不含参数的构造函数,一般没什么用,因为value是不可变量
    public String() {
        this.value = new char[0];
    }
    //参数为String类型
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
    //参数为char数组,使用java.utils包中的Arrays类复制
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }
    //从bytes数组中的offset位置开始,将长度为length的字节,以charsetName格式编码,拷贝到value
    public String(byte bytes[], int offset, int length, String charsetName)
            throws UnsupportedEncodingException {
        if (charsetName == null)
            throw new NullPointerException("charsetName");
        checkBounds(bytes, offset, length);
        this.value = StringCoding.decode(charsetName, bytes, offset, length);
    }
    //调用public String(byte bytes[], int offset, int length, String charsetName)构造函数
    public String(byte bytes[], String charsetName)
            throws UnsupportedEncodingException {
        this(bytes, 0, bytes.length, charsetName);
    }

    这里需要注意的一点是,String不属于8种基本数据类型,String是一个对象。

    因为对象的默认值是null,所以String的默认值也是null;

    但它又是一种特殊的对象,有其它对象没有的一些特性。

    比如构造方法new String()和new String(“”)都会返回一个空字符串而不是null。

    2.StringBuffer源码

    AbstractStringBuilder是StringBuilder和StringBuffer都继承的抽象类,StringBuilder和StringBuffer中操作字符串的方法大部分都在其中,是一个核心抽象类,大家可以深入了解以下
    value是一个char类型数组,给StringBuffer赋一个初始容量

     

     StringBuffer被synchronized所修饰,是StringBuffer实现线程安全的,toStringCache作用:返回最后一次toString的缓存值,一旦StringBuffer被修改就清除这个缓存值。

    StringBuffer是线程安全,被synchronized关键字修饰,性能与StringBuilder相比当然大打折扣,线程安全的应用场景是多线程,那么访问的数量级肯定多,所以弄个缓存,可以平衡StringBuffer的性能

     

     3.StringBuilder源码

    stringBuilder和stringBuffer很相似,1.只是stringBuffer所有的方法都加上了synchronized进行修饰,保证stringBuffer是线程安全的,2.toStringCache:加入缓存,提高stringBuffer的效率

    暂时就介绍到,能力有限,深度不够,以后再进行改进

  • 相关阅读:
    Stanford NLP 第六课: Long Short Term Memory
    Stanford NLP 第五课: RNN Vanishing Gradient Problems Details
    Stanford NLP 第四课 神经网络复习
    Stanford cs224n 第三课: GloVe 代码解读
    Stanford CS224N 第二课: word2vec踩坑经验分享
    秒杀抢购系统优化思路详解
    微服务的事件驱动数据管理方案
    Netty与网络编程
    Netty 学习 一、初识Netty【原创】
    高性能Server---Reactor模型【转载】
  • 原文地址:https://www.cnblogs.com/wyrlzy/p/13832287.html
Copyright © 2011-2022 走看看