String 学习小结

1. String 为什么不可变?
  • String底层存储字符串的是“char[]”(JDK1.8之后改成了 byte[]),这个数组被定义成了 final 类型,决定了 String 的对象实例只能初始化一次,但是这也只是保证了 String 的对象引用不能改变,不能保证数组内容不能改变。
final char[] value={"1","2","3"};
value[2]="4";//这时候数组里已经{"1","2","4"}
  • 底层存储字符串的数组的访问权限修饰词是 private,而且没有提供对外暴露的 setter 和 getter 方法,保证了外部无法改变其内容。而且在整个 String 的方法中,也是小心翼翼的没有改变数组内容的地方。
  • 整个类的修饰符是 final,保证 String 类不可被继承,避免了子类继承破坏定义。

综上:String 的不可变,是因为其设计和实现如此,而不是单单因为底层的数组被定义成了 final。

2. 为什么要把 String 设计成不可变?
  • 性能优化:在JDK1.7以前,字符串常量池位于方法区内,而在JDK1.7及以后,字符串常量池被转移到堆内充当中。当创建一个String对象时,会优先查询常量池中是否存在该字符串常量,如果存在直接引用已经存在的对象。因为 String 在 JAVA 中的使用场景非常多,如果每次使用,都重新创建,即耗内存也耗时间,严格意义上来说是一种优化思想。
  • 安全性:前面提到过,在 JAVA 语言中 String 可谓是最常用的类之一,经常被其他的类库单做参数使用。
    如果其内容是可变的,会带来很多未知且不可控的问题。

你可能感兴趣的:(String 学习小结)