Job Study 3 String

参考文献
[1] https://juejin.cn/post/7226157821708648509
[2] https://blog.csdn.net/hl_java/article/details/104352925
final修饰String类
1 | public final class String |
- final:表示String类不可被继承
- String字符串是常量,一旦被创建,不可改变
- String字符串缓冲区支持可变字符串
- 因为String不可变,即String可共享。
final修饰的value[]
1 | private final char[] value; |
- value是一个私有的字符数组,String通过这个value保存字符串内容。
- 由final修饰,不可修改。
存储
Java中使用字符串常量池存储字符串字面量。
- 由于JDK版本不同,常量池位置也不同
- JDK6及以下字符串常量池在方法区(perm Gen)中,此时常量池存储字符串对象。
- 在JDK8中,方法区(永久代被元空间取代)。
- JDK7,8中,字符串常量池被转移到堆中,此时常量池存储字符串对象的引用,而不是字符串对象本身。
不可变性的优点
- 只有当字符串不可变,字符串池才可实现。字符串池可以节省很多heap空间,因为不同的字符串引用都可以指向池中同一个字符串。
- (存疑)如果字符串可变,可能会引起严重的安全问题。
- 字符串不可变,使得同一个字符串实例可以被多个线程共享。
- 字符串不可变,在字符串对象创建的时候,hashCode就被执行并把结果缓存,每次使用hashCode不需要重新计算。字符串变得很容易去成为Map的键。
缺点
- 丧失灵活性。可以通过StringBuilder弥补这个缺点。
- 脆弱的不可变性。String可以通过JNI或反射来改变其不可变性。
评论