String源码分析(四)

时间:2022-10-29 16:56:32

String源码分析(四)

???? 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家,51CTO明日之星

???? 擅长领域:全栈工程师、爬虫、ACM算法

???? 公众号:知识浅谈

String源码分析(四)总结 ????这次都给他拿下????

正菜来了⛳⛳⛳

????String源码相关函数

????nonSyncContentEquals

含义:这个函数的主要作用就是异步的判断当前String对象是否与sb对象的char数组相等。

private boolean nonSyncContentEquals(AbstractStringBuilder sb) {
char v1[] = value;
char v2[] = sb.getValue();
int n = v1.length;
if (n != sb.length()) {
return false;
}
for (int i = 0; i < n; i++) {
if (v1[i] != v2[i]) {
return false;
}
}
return true;
}

????contentEquals(CharSequence cs)

含义:将此字符串与指定的 CharSequence 进行比较。当且仅当此 String 表示与指定序列相同的 char 值序列时,结果才为真。请注意,如果 CharSequence 是 StringBuffer,则该方法会在其上同步。

public boolean contentEquals(CharSequence cs) {
// Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) {
if (cs instanceof StringBuffer) {
synchronized(cs) {
return nonSyncContentEquals((AbstractStringBuilder)cs);
}
} else {
return nonSyncContentEquals((AbstractStringBuilder)cs);
}
}
// Argument is a String
if (cs instanceof String) {
return equals(cs);
}
// Argument is a generic CharSequence
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;
}

????equalsIgnoreCase(String s)

含义:将此字符串与另一个字符串进行比较,忽略大小写注意事项。如果两个字符串的长度相同,并且两个字符串中的对应字符相等,忽略大小写,则认为两个字符串相等。

public boolean equalsIgnoreCase(String anotherString) {
return (this == anotherString) ? true
: (anotherString != null)
&& (anotherString.value.length == value.length)
&& regionMatches(true, 0, anotherString, 0, value.length);
}

????int compareTo(String anotherString)

通俗解释:这个函数就是比较当前对象和传入的String对象的大小,当然是按照UNICODE码进行比较的。 官方解释:按字典顺序比较两个字符串。比较基于字符串中每个字符的 Unicode 值。此 String 对象表示的字符序列按字典顺序与参数字符串表示的字符序列进行比较。如果此 String 对象按字典顺序位于参数字符串之前,则结果为负整数。如果此 String 对象按字典顺序跟随参数字符串,则结果为正整数。如果字符串相等,则结果为零;当 equals(Object) 方法返回 true 时,compareTo 返回 0。这是字典顺序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,或者它们的长度不同,或两者兼而有之。如果它们在一个或多个索引位置具有不同的字符,则设 k 为此类索引中的最小;然后,在位置 k 处的字符具有较小值的字符串(通过使用 < 运算符确定)按字典顺序位于另一个字符串之前。在这种情况下,compareTo 返回两个字符串中位置 k 。

public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;

int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}

????compareToIgnoreCase

含义:这个和上边的差不多,只不过这个是忽略了大小写进行比较两个字符串的。

public int compareToIgnoreCase(String str) {
return CASE_INSENSITIVE_ORDER.compare(this, str);
}

????regionMatches

含义:此 String 对象的子字符串与参数 other 的子字符串进行比较。如果这些子字符串表示相同的字符序列,则结果为真。要比较的此 String 对象的子字符串从索引 tooffset 开始,长度为 len。要比较的 other 的子字符串从索引 ooffset 开始,长度为 len。当且仅当以下至少一项为真时,结果为假

public boolean regionMatches(int toffset, String other, int ooffset,
int len) {
char ta[] = value;
int to = toffset;
char pa[] = other.value;
int po = ooffset;
// Note: toffset, ooffset, or len might be near -1>>>1.
if ((ooffset < 0) || (toffset < 0)
|| (toffset > (long)value.length - len)
|| (ooffset > (long)other.value.length - len)) {
return false;
}
while (len-- > 0) {
if (ta[to++] != pa[po++]) {
return false;
}
}
return true;
}

这个函数还有一个重载函数,就是加一个布尔值,主要是用于在匹配的时候是否忽略大小写。

????总结

以上是关于String源码分析的相关函数,希望有所帮助,Written By ​​知识浅谈​