String是不可变的
String是不可变的,准确来说是String内部的char数组是不可变的。
# 关于为什么String不可变?
第一次思考这个问题,我认为是String使用private对内部char数组进行修饰,
并且String的一些方法比如subString、toLowerCase返回的是一个新字符串,保证了String的不可变
第二次思考这个问题,我认为是字符串常量池设计的巧妙。当我们需要一个新的String变量的时候,会先去检查
常量池中是否有这个字符串,如果没有再创建一个新的String对象放到常量池中
# String不可变带来的好处?
(1)安全。比如一些账号密码,一不小心修改就会有安全隐患
(2)线程安全。不可变就是只读,不存在并发修改问题,绝对是线程安全的
(3)节省空间,先去看常量池中有没有,没有再去创建
# 举一反三
Integer类也借鉴了常量池的思想,valueOf方法会查看有没有-128~127的缓存,如果有就返回缓存
StringBuilder、StringBuffer是可变的
区别:
- StringBuffer是线程安全的,如果点开源码查看,会看到所有方法上面都加了synchronized关键字来同步
- StringBuilder是线程不安全的,没有做同步措施
- StringBuffer有缓冲区
综合性能来说,StringBuilder > StringBuffer > String