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 的声明 由 JDK 中关于String的声明可以知道: 不同字符串可能共享同一个底层char数组,例...
    CodeKing2017阅读 1,653评论 1 2
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,404评论 0 4
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,830评论 2 9
  • String 是Java编程中的引用类型,不属于基本类型,默认值为null,在Java中是用来创建于操作字符串。源...
    小杰的快乐时光阅读 557评论 0 1
  • 人们总以为余生很长,很多事情是不着急的。18岁的时候想学画画,等毕业再说吧;25岁的时候想多学一门外语,等工作稳定...
    Life_53a9阅读 84评论 0 1