字符串类
重要的字符串类有 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 的类层次结构如下: