String和StrngBuffer的区别

String和StringBuffer

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

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

String和StrngBuffer的区别_第1张图片
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); //获得新容量
 }

你可能感兴趣的:(String和StrngBuffer的区别)