String 学习小结

作者: DemonJun | 来源:发表于2019-03-01 14:03 被阅读31次
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 学习小结

    1. String 为什么不可变? String底层存储字符串的是“char[]”(JDK1.8之后改成了 byt...

  • String小结

    /** * String字符串: * 由多个字符组成的一串数据 * 字符的本质是一个字符数组 * * 两种创建方式...

  • java String.split()函数的用法分析

    声明:### 本片文章纯属转载转载自:Java String.split()用法小结java String.spl...

  • 复习进度日更2

    日期:2020.1.12.17 学习时长:0.5H 政治学习内容小结:未学习 英语学习内容小结:未学习 专业科学习...

  • 复习进度日更3

    日期:2020.1.12.17 学习时长:0.5H 政治学习内容小结:未学习 英语学习内容小结:未学习 专业科学习...

  • String学习

    1.获取字符串长度有特定的属性:String.Length 2.双等号“==”,可以直接用来比较字符串是否相同 3...

  • String学习

    java.lang.String类学习 概念 在Java编程中广泛使用的字符串是一系列字符。在Java编程语言中,...

  • 复习进度日更1

    日期:2020.12.16 学习时长:0.5h 政治学习内容小结:未完成学习 英语学习内容小结:未完成学习 专业科...

  • 渗透命令行

    本文仅作学习记录,如有侵权,请联系删除 Linux命令小结: wmic命令小结: cmd命令小结: powersh...

  • 2017.9.11. Yu - 日记 - 秋季

    小结 - 上学;学习,看书。 明日计划 - 上学;学习。

网友评论

    本文标题:String 学习小结

    本文链接:https://www.haomeiwen.com/subject/ykjduqtx.html