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