为什么String是不可变的
String所有属性都被final修饰、私有的并且没有提供修改方法。 (主要字段是char数组,虽然被final修饰但数组是可变的,私有保证了不被修改但还是可以通过反射来改变String)
为什么String设计成final
避免被继承后破坏,防止方法被重写
为什么String设计成不可变的
- 字符串常量池的需要,提升效率和减少内存分配
- 安全性考虑,防止被意外修改(HashSet中存的值如果是可变的String,则破坏了唯一性;不可被写所以线程安全;)
- 作为HashMap、HashTable等hash型数据key的必要。因为不可变的设计,jvm底层很容易在缓存String对象的时候缓存其hashcode,这样在执行效率上会大大提升。
创建变量
- 显式的String常量
String a = "test";
在常量池中创建了String对象,若存在则不创建返回相同对象 - String对象
String a = new String("test");
Class被加载时就在常量池创建了String对象(若有就不创建),执行时在堆中创建String对象
intern()方法
intern用来返回常量池中的某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用。否则,在常量池中加入该对象,然后返回引用。
推荐阅读: