Java 源码--String

String类被定义为final,实现了SerializableComparableCharSequence接口。

String的值是char类型数组。

1
private final char value[];

在方法isEmpty()中,判断的其实就是字符串的长度,长度为0返回true。

1
2
3
public boolean isEmpty() {
return value.length == 0;
}

我们平常使用的equals方法比较的就是两个字符数组是否想等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public boolean equals(Object anObject) {
// 若两个对象地址相等,直接返回true
if (this == anObject) {
return true;
}
// 只有在参数是String类型时才相等
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;
}

在参数为StringBuffer类型和StringBuilder类型的构造方法中,可以看出,对于StringBuffer的线程不安全性做了处理,使用锁将参数锁起来,防止其他地方进行修改。

1
2
3
4
5
6
7
8
9
public String(StringBuffer buffer) {
synchronized(buffer) {
this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
}
}

public String(StringBuilder builder) {
this.value = Arrays.copyOf(builder.getValue(), builder.length());
}

StringStringBufferStringBuilder也可以判等,比较的是他们的字符序列。

1
2
3
4
public boolean contentEquals(StringBuffer sb) {
// 将StringBuffer转为字符序列和String的字符序列进行比较
return contentEquals((CharSequence)sb);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public boolean contentEquals(CharSequence cs) {
// 参数是一个StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) {
if (cs instanceof StringBuffer) {
// StringBuffer要注意线程安全
synchronized(cs) {
return nonSyncContentEquals((AbstractStringBuilder)cs);
}
} else {
return nonSyncContentEquals((AbstractStringBuilder)cs);
}
}
// 参数是一个String
if (cs instanceof String) {
return equals(cs);
}
// 参数是一个普通的字符序列
char v1[] = value;
int n = v1.length;
if (n != cs.length()) {
return false;
}
for (int i = 0; i < n; i++) {
if (v1[i] != cs.charAt(i)) {
return false;
}
}
return true;
}

Java 源码分析 — String 的设计

-------------本文结束感谢您的阅读-------------

本文标题:Java 源码--String

文章作者:huihui

发布时间:2018年11月09日 - 00:11

最后更新:2019年02月14日 - 19:02

原始链接:http://101.200.47.120:8011/2018/11/09/Java 源码--String/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。