String和StrngBuffer的区别

String和StringBuffer

  • 1 String: 常量不可变,声明时即在内存(堆)中分配固定长度,且之后不可修改。适用于不易修改的字符串。

  • 2 StringBuffer: 变量可修改,new对象时会在内存(堆)中新建一段字符缓冲区。适用于频繁修改的字符串,且线程安全。

Paste_Image.png

如上图

67行执行之后,a和b引用同一对象"123",8行a+"123"会形成一个新的对象,即在内存(堆)中新分配的一个固定长度块("123123"),a引用这个新的对象。10行同理,再c后拼接"456",形成一个新的对象。
Stringbuffer对象的更改操作不会新建对象,new时会分配一个字符缓冲区,若操作字符的长度大于缓冲区长度,则会扩展缓冲区。

Java的StringBuffer关于容量长度的源码

 void expandCapacity(int minimumCapacity) {
     int newCapacity = value.length * 2 + 2; //新容量等于“旧容量的2倍加2个字符”
     if (newCapacity - minimumCapacity < 0) //如果翻倍后,容量仍比需要的容量小,就用后者   
         newCapacity = minimumCapacity;
     if (newCapacity < 0) {
        if (minimumCapacity < 0) // overflow
        throw new OutOfMemoryError();
        newCapacity = Integer.MAX_VALUE;
    }
    value = Arrays.copyOf(value, newCapacity); //获得新容量
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容