String类学习day1(String类的声明,内部声明的属性,字符串常量池,String的特性,其他)

100 阅读2分钟

day 28 2025.4.27

  1. 类的声明

    1. public final class String implements Serializable, Comparable<--->, CharSequence {}
    2. final : 修饰类时,该类不能被继承
    3. Serializable : 实现该接口时,可以被ObjectOutputStream序列化和ObjectInputeStream反序列化到本地.
    4. Comparable<---> : 实现该接口,并实现compareto方法后.该类的对象就可以进行比大小.
  2. 内部声明的属性
    private final char[] value; jdk8及以前.
    private final byte[] value; jdk9及以后.
    Q : 为什么String类内部的数组由char[]变为了byte[]?
    A : 1.节省内存;2.提高性能.

  3. 字符串常量的存储位置

    1. 字符串常量存在字符串常量池(StringTable)中
    2. 字符串常量池不允许存在两个相同的字符常量
    3. 字符常量池在不同jdk版本中,存在的位置不同
      • jdk7及以前 : 字符串常量池存在**方法区(永久代)**中.
      • jdk8及以后 : 字符串常量池存在中.
        Q : 为什么jdk8及以后,字符串常量池从方法区转移到堆中了呢?
        A : 1.避免方法区缓冲溢出 : 因为在jdk8及以前的字符串常量池都在方法区(永久代)中,只有在FullGC时才会清除永久代里的对象,因此如果一次性创建了大量字符串,方法区可能因此溢出.
        2.提高垃圾回收效率 :堆是垃圾回收的主要区域,垃圾回收器可以更有效地管理堆中的内存。
        3.优化字符串的操作性能 :在堆中,字符串对象的存储和访问更加灵活。
  4. String的不可变性

    1. 当字符串重新赋值时,本质上只是把新字符串的地址赋值给当前变量.
    2. 在底层 String类是通过final byte[] 存放数据的,因为byte[]被final修饰,所以在byte[]被构造器赋初值之后,数组内数据不会再变.
    3. 调用replace()返回一个新字符串,不会改变原来的字符串.
  5. 其他
    在 Java 里,仅存在值传递,不存在地址传递。