1 如何理解不可变
不可变通常指这个类声明的对象不可变,即对象初始化完毕就不能改变它的状态。对象的状态就是由它的属性决定的,即全局变量;那么不可变对于基本数据类型的属性(全局变量)就是值无法改变,不可变对于引用类型的属性(全局变量)就是其指向的对象以及对象的状态不可变。
2 String不可变体现在什么地方
- String类在定义时声明为final类型,告诉编译器我是不可变的类;
- String类全局变量都定义为private final类型,且不提供get和set方法,表明对象一旦初始化,属性值就无法改变;
3 String设计成不可变有什么好处
- 线程安全。不可变类表明类的属性初始化后不可改变,即对象的不可变;那么当多线程来访问此对象时不用担心线程安全问题,所以String类的对象是线程安全的;
- 符合字符串常量池的设计。当我们声明一个字符串对象时,编译器首先会去字符串常量池中查找是否存在,若存在则把字符串引用直接指向池中的对象,避免重复声明;若不存在则生成一个对象并放入到池中,供后续使用;虽然String不是Java语言的基本数据类型,但使用非常频繁,避免重复声明可以节省一大部分的内存开销,从而减少GC的时间。
- 确保hashCode的唯一性。hashMap中是以key的hashCode为存储地址,地址当然是不变的好,不然如何查找可变的地址;不可变String对象的hashCode是唯一的,所以能很好的适用hashMap中的key;