java String源码阅读2
2011-10-20 22:25
267 查看
对compareTo(StringanotherString)和compareToIgnoreCase(Stringstr)进行阅读。
分两种情况i==j和i!=j。认为只用else部分的代码就能够判断字符串的大小。i++先使用i再加。
compareToIgnoreCase(Stringstr)
内部实现:
public int compareToIgnoreCase(String
str) {
returnCASE_INSENSITIVE_ORDER.compare(this,str);
}
CASE_INSENSITIVE_ORDER是一个静态类,此类实现了Comparable<String>接口:
publicstaticfinalComparator<String>
CASE_INSENSITIVE_ORDER
=newCaseInsensitiveComparator();
private static class CaseInsensitiveComparator
implements Comparator<String>,
java.io.Serializable {
//use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID=
8575799808933029326L;
public int compare(String
s1, String s2) {
int n1=s1.length(), n2=s2.length();
for(inti1=0,
i2=0; i1<n1 && i2<n2; i1++, i2++) {
char c1 = s1.charAt(i1);
char c2 = s2.charAt(i2);
if(c1 != c2) {
c1 =Character.toUpperCase(c1);
c2 =Character.toUpperCase(c2);
if(c1 != c2) {
c1= Character.toLowerCase(c1);
c2= Character.toLowerCase(c2);
if(c1 != c2) {
return c1 - c2;
}
}
}
}
return n1 - n2;
}
}
通过charAt()函数获取,字符串中的每个字符。进行比较,在compareTo中也可以通过此种方式实现。总之这两个函数的实现难度不打。compareTo是直接使用value数组,而compareToIgnoreCase()使用了String类中的charAt函数。
其中++和—的使用和字符大小的比较是值得学习的。
concat(Stirngstr)函数,对字符串连接。Strings
= "string";s是“string”的引用
s.concat("concat");方法调用后s是另一个字符串(”stringconcat”)的引用。具体实现:
public String concat(String
str) {
int otherLen = str.length();
if(otherLen == 0) {
return this;
}
charbuf[] =
newchar[count+
otherLen];
getChars(0,count, buf,0);
str.getChars(0,otherLen, buf,
count);
return new String(0,
count+ otherLen, buf);
}
方法中使用一个char的buf用来存储,新的字符串中的字符。ReturnnewString(0,
count+ otherLen, buf);返回一个新生成的字符串。GetChars中使用ArrayCopy实现。
public int compareTo(String anotherString) { int len1 = count; int len2 = anotherString.count; int n = Math.min(len1,len2); char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; if(i == j) { intk = i; intlim = n + i; while(k < lim) { charc1 = v1[k]; charc2 = v2[k]; if(c1 != c2) { returnc1 - c2; } k++; } }else{ while(n-- != 0) { charc1 = v1[i++]; charc2 = v2[j++]; if(c1 != c2) { returnc1 - c2; } } } returnlen1 - len2; }
分两种情况i==j和i!=j。认为只用else部分的代码就能够判断字符串的大小。i++先使用i再加。
compareToIgnoreCase(Stringstr)
内部实现:
public int compareToIgnoreCase(String
str) {
returnCASE_INSENSITIVE_ORDER.compare(this,str);
}
CASE_INSENSITIVE_ORDER是一个静态类,此类实现了Comparable<String>接口:
publicstaticfinalComparator<String>
CASE_INSENSITIVE_ORDER
=newCaseInsensitiveComparator();
private static class CaseInsensitiveComparator
implements Comparator<String>,
java.io.Serializable {
//use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID=
8575799808933029326L;
public int compare(String
s1, String s2) {
int n1=s1.length(), n2=s2.length();
for(inti1=0,
i2=0; i1<n1 && i2<n2; i1++, i2++) {
char c1 = s1.charAt(i1);
char c2 = s2.charAt(i2);
if(c1 != c2) {
c1 =Character.toUpperCase(c1);
c2 =Character.toUpperCase(c2);
if(c1 != c2) {
c1= Character.toLowerCase(c1);
c2= Character.toLowerCase(c2);
if(c1 != c2) {
return c1 - c2;
}
}
}
}
return n1 - n2;
}
}
通过charAt()函数获取,字符串中的每个字符。进行比较,在compareTo中也可以通过此种方式实现。总之这两个函数的实现难度不打。compareTo是直接使用value数组,而compareToIgnoreCase()使用了String类中的charAt函数。
其中++和—的使用和字符大小的比较是值得学习的。
concat(Stirngstr)函数,对字符串连接。Strings
= "string";s是“string”的引用
s.concat("concat");方法调用后s是另一个字符串(”stringconcat”)的引用。具体实现:
public String concat(String
str) {
int otherLen = str.length();
if(otherLen == 0) {
return this;
}
charbuf[] =
newchar[count+
otherLen];
getChars(0,count, buf,0);
str.getChars(0,otherLen, buf,
count);
return new String(0,
count+ otherLen, buf);
}
方法中使用一个char的buf用来存储,新的字符串中的字符。ReturnnewString(0,
count+ otherLen, buf);返回一个新生成的字符串。GetChars中使用ArrayCopy实现。
相关文章推荐
- java.lang之java.lang.String 源码阅读及分析
- 阅读Java String源码遇到的问题
- Java源码阅读之String(3)
- java.lang.String源码阅读笔记
- Java源码阅读之StringBuidler
- Java源码阅读之String(4)
- Java源码阅读之String
- java.lang.String源码阅读笔记
- Java源码阅读之String(2)
- Java源码阅读之String(终)
- java+String源码阅读1
- JAVA源码阅读--String
- java源码阅读-java.lang.String(01)
- java String 源码阅读笔记以及Unicode的学习
- Java Jdk1.8 HashMap源码阅读
- java的String学习加JDK源码的学习
- [置顶] JAVA源码阅读——–Integer类
- 黑马程序员【阅读源码理解String对象的不变性】
- Java源码阅读之Stack
- 源码阅读笔记 - 3 std::string 与 Short String Optimization