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 @   lenbkan  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示

目录导航