1. 字符串
String在java.lang包里,是个final类,不可被继承。它的主要通过一个字符数组来存储。
private final char value[];
2. 字符串的不可改变特性(immutable)
2.1 什么是不可变
比如,String a = "abc";a = "abcdef",不是在原内存地址上修改数据,而是在内存区域重新创建了值为"abcdef"的字符串(如果字符串池中"abcdef"已存在,则不创建),将a指向此内存地址。
2.2 不可变有什么好处
Java把String设成immutable最大的原因应该是效率和安全。
- 不可变对象可以提高String Pool的效率和安全性。
如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存效率也很高。对于同时引用这个“ABC”的其他变量也不会造成影响。 - 不可变对象对于多线程是安全的.
因为在多线程同时进行的情况下,一个可变对象的值很可能被其他进程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况。
2.3 如何实现的不可变
String的主要成员 char []value 是 private final的。final限制了value这个存在stack中的引用地址不能改变。但是,heap中数组存储的数据怎么保证不变呢?String中的所有方法都没有动value数组中的数据,private 私有修饰符确保不暴露给外界,并且String中也没有value的setter方法。String类的final属性,防止继承者破坏。
3. 字符串常量池
如果按照下面赋值:
String a = "aa";
String aa = "aa";
则a 和 aa 指向同一个内存地址.