字符串类
重要的字符串类有 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 的类层次结构如下:
标签:Java,String,int,StringBuilder,基础,value,字符串,return From: https://www.cnblogs.com/baokang/p/18552335