String不可变:String值储存在常量池中。一个已有字符串"abcd",如果改变值成"abcedl",不是在原内存地址上修改数据,而是在常量池中查找或生成这个新值,再把引用指向新值的地址,如图:
为什么不可变
- String 类本身是final的,不可以被继承
- String类内部通过private final char value[]实现,从而保证了引用的不可变和对外的不可见
- String内部通过良好的封装,不去改变value数组的值
为什么要设计成不可变
1. 安全性
- 线程安全,不可变天生线程安全
- String常被用作HashMap的key,如果可变会引有安全问题,如两个key相同
- String常被用作数据库或接口的参数,可变的话也会有安全问题
2. 效率
- 通过字符串池可以节省很多空间
- 每个String对应一个hashcode,再次使用的话不用重新计算
扩展
可以用反射来改变String中value的值,所以严格意义上说不一定不可变