Job Study 3 String
uwupu 啦啦啦啦啦

参考文献

[1] https://juejin.cn/post/7226157821708648509

[2] https://blog.csdn.net/hl_java/article/details/104352925

final修饰String类

1
2
3
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc
  • 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或反射来改变其不可变性。
 评论