String和StringBuffer
2.String
不可继承 和 不可变
它是final Class , 不可继承
public final class String implements java.io.Serializable, Comparable<String>, CharSequence
用char类型的数组存储内容,final 修饰,且没有提供set(), 一旦初始化,值不能改变
private final char value[];
初始化
String = 的形式:
String a="abc"; String b="abc"; 创建1个对象 它的判断依据是String类equals(Object obj)的返回值
String a="ab"+"cd"; 创建3个对象
new 的形式:
String a = new String("abc"); 创建两个对象, 一个在堆中, 一个在常量池中
()中的"abc"首先被创建, 存储在常量池; 在创建a ,存储在堆中,和其他的对象时一样的 ,如下图所示
+号连接
String c = "a" + "b " + c + "d"; 通过查看字节码文件,发现实现过程如下:
String c = new StringBuilder("ab").append(c).append("d").toString();
1. 前两字符串: "a" + "b" 产生一个新的对象 String new ="ab"
2. new 和后面的字符串执行 append 操作, 产生一个 StringBuilder 对象
StringBuffer
线程同步的,可变的对象,可变指的是属性的值
内部存储 : 可变的
用char类型的数组存储内容, 来自于父类,对外提供set(), 因此数组可变
char[] value;
当进行append操作时, 实际上改变的是这个数组, 不会创建新的StringBuffer对象
扩充容量
当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展
int newCapacity = value.length * 2 + 2;
然后申请一段更大的内存空间,将当前char数组拷贝到新的位置
value = Arrays.copyOf(value, newCapacity); //新的value
祝:
大家生活愉快,工作顺利