【彻底理解】为什么String类要被设计为不可变的
2020-02-23 本文已影响0人
TUCJVXCB
我从效率和安全两个方面来分析这个问题
- 效率
- 常量池能存在的原因就是因为String是不可变的。
假如我们创建一个s1:String s1 = "abc";,这个时候常量池中就会放入一个abc字符串,接着我们创建s2: String s2 = "abc";, 这个时候不会创建新的字符串abc了,而是s1,s2同时指向常量池中的"abc"(这种机制能节省大量的堆空间)。我们这时改变s1的值,将abc改成abcd,如果String类型是可变的话,那么常量池中的abc就变成了abcd,进而影响了s2的值,所以String要设计为不可变的。
- 由于String不可变,所以在String对象在创建之时,哈希码就被缓存了,无需再次计算。这也是为什么String类被大量作为Map的Key的原因,他的效率要比其他对象要高
- 安全
- String不可变保证了线程安全,他能够被直接用在多线程环境下
- Java有很多类都是用String来作为URL。比如数据库的URL、UserName、Password。如果String是可变的话,系统将极为不安全。