Java 基础(二)字符串类

字符串类

重要的字符串类有 String、StringBuilder、StringBuffer

1、String

String 是不可变类,内部是由 final 定义的字符数据构成。

private final char value[];

1.1 String 类的层次结构如下:

String 实现了比较接口,字符序列接口,序列化接口,具有以上接口的特性

1.2 重写了 Object 的 equals() 和 hash() 方法

使用字符去比较和计算哈希值

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = value.length;
    if (n == anotherString.value.length) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = 0;
        while (n-- != 0) {
            if (v1[i] != v2[i]) {
                return false;
                i++;
            }
        return true;
        }
    }
    return false;
}
    
public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

1.3 String 常量池 在 JVM 中的存储位置

在 jdk1.7 之前,字符串常量池存储于方法区中

在 jdk1.7 以及之后,字符串常量池存储于堆中,主要原因:(1)方法区空间有限,容易造成方法区内存溢出(2)放在堆中可以进行复用,节省存储空间

 

2、StringBuilder

StringBuilder 是可变类,内部使用字符数组实现 ,并且有一个 内置计数器。

StringBuilder 是线程不安全的,类实现没有使用同步机制。

使用了构建器模式,每一个修改操作都会返回自身。

使用计数器是因为,value 初始化的时候可能会适当扩展数组(+16),但是实际上内容长度没有扩大

char[] value;
int count;

// 构造函数
public StringBuilder(String str) {
    // 数组长度
    super(str.length() + 16);
    // 真正字符长度
    append(str);
}

2.1 StringBuilder 类的层次结构如下:

对于字符串的具体操作,全部由 AbstractStringBuilder 实现,StringBuilder 中只有四个构造函数

2.2 append 方法流程图

 

3、StringBuffer

StringBuffer 是 StringBuilder 的线程安全版本,所有读写操作使用 synchronized 进行修饰,多线程环境下有且只有一个线程可以对 StringBuffer 对象进行读写

StringBuffer 的类层次结构如下:

 

posted @ 2024-11-18 13:33  lenbkan  阅读(3)  评论(0编辑  收藏  举报