String类是final类,即不可以被继承.同时String类也实现了Serializable,Comparable,CharSequence;
首先,String类实现Serializable接口,说明String是可以被序列化的
实现Comparable接口,观察String类中compareTo方法:
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;
}
可以看出,String类的对比逻辑为: 从两个字符串的头开始比较,如果字符不相等,则字符小的排在后面,如果相等,则对比下一位,如果都相等,则长的在前;例如:"abcdef","abcdefgh",则根据对比如果都相等,则长的在前,可以得出后一个字符串在对比的时候优先级高.
另外,String也可以通过比较器比较,但String自带的比较器CaseInsensitiveComparator类是给String中compareToIgnoreCase方法准备的,在java中的比较器中比较方法是这样的:
public int compare(String s1, String s2) {
int n1 = s1.length();
int n2 = s2.length();
int min = Math.min(n1, n2);
for (int i = 0; i < min; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
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) {
// No overflow because of numeric promotion
return c1 - c2;
}
}
}
}
return n1 - n2;
}
一开始看时有疑惑,为什么要比较后转化为大写比较,再转化为小写比较, 在网上查阅得知:
There are Unicode characters which are different in lowercase, but have the same uppercase form. For example the Greek letter Sigma - it has two lowercase forms (σ, and ς which is only used at the end of the word), but only one uppercase form (Σ).
意思就是希腊字母西格玛有两种形式的小写σ,ς大写则是Σ,所以才会有比完大写比小写的情况.
public boolean regionMatches(int toffset, String other, int ooffset,int len)
方法:regionMatches
regionMatches方法,比较两个字符串中一个区域,相等返回true,不相等返回false, 其中有4个参数, 意思分别为: toffset->第一个字符串起始位置, other->第二个字符串, ooffset->第二个字符串起始位置, len -> 比较长度,
regionMatches还有一个重载方法,在第一个参数前加了一个参数,是否忽略大小写.
方法:startWith和endWith,意思是是否已另一个字符串为开头或结尾, 判断开头时可以自定义起始位置,
方法:indexOf
indexOf有许多变体,
indexOf(int ch)是返回字符在String中第一次出现的位置,
indexOf(int ch,int formIndex) 可以设置初始位置
lastIndexOf 同indexOf 不过是从后向前查询
indexOf(String str) 返回一个字符串在此字符串中第一次出现的位置
indexOf终极版,参数有6个,char[],int,int, char[], int, int 看参数应该能看出意思, 设置第一个字符数组的开始和长度,第二个的开始和长度, 然后返回第二个字符数组在第一个字符数组中第一次出现的位置.
方法:substring
相信大家都会用,substring(int beginIndex) 截取从deginIndex开始到结束,substring(int beginIndex,int endIndex)截取从beginIndex到endIndex
在返回值中会这样写: return (beginIndex==0)?this:new String(value,beginIndex,subLen);
可见String对截取字符串采用新new一个字符串作为返回值;
方法:concat(String str)
将str连接到本字符串的末尾
方法:replace(char oldChar,char newChar)
在String中 replace为替换, 将oldChar转化为newChar,在转化完成后,重新new一个新的字符串返回,
方法:matches
通过正则查询是否有匹配项
方法:contains
查询是否存在子序列
方法:split
切分字符串,但要注意, split的性能是比较低的,所以如果字符串的分割在程序中所占比例比较大时不推荐使用,
方法:join(CharSequence delimiter,CharSequence... elements)
CharSequence可以看做为String,join的意思为将elements每两个之间插入一个delimiter,然后返回单个字符串
方法:toLowerCase
将大写转化为小写,new一个新的返回,
方法:trim
将字符串两端字符unicode编码小于等于32的所有字符全部去掉
方法:format(String format,Object... args)
字符串格式化, 其实就是替换,将字符串中符合规则的子序列替换为后面的Object参数
唯一一个本地方法:intern()
具体可以查看以下内容:
https://blog.csdn.net/wjzhang5514/article/details/70209403