JDK源码分析一
2017-01-12 本文已影响30人
蛮大人我们走
String结构
private final char value[];//这是用于存储String字符的数组
private final int offset;//这是value数组的第一个有效的字符的index private final int count;//这是String中的字符个数
private int hash; // 存储String的hashcode,默认是0
用一个char数组来存储字符,offset是偏移,count是String的长度。需要注意的是,String类是final的,不可以被继承,而private final char value[]; 只能被赋值一次,赋值后不能再变,只有重新生成一个String对象。
public String concat(String str)
public String concat(String str){
int otherLen=str.length();
if(otherLen==0) return this;
char[] buf=new char[count+otherLen];//作为容器
getChars(0,count,buf,0);//从this中取出char放入buf中
str.getChars(0,otherLen,buf,count);//从str中取出char放入buf中
return new String(0,count+otherLen,buf);
}
该段代码是用来连接两个字符串的。
getChars(需要拷贝的字符串开始地方,需要拷贝的字符串结束的地方,拷贝到该字符串buf,拷贝到buf的某处开始);
public int indexOf(String str,int fromIndex)
从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。
public int indexOf(String str,int fromIndex){
return indexOf(value,offset,count,
str.value,str.offset,str.count,fromIndex);
}
//source为源字符,sourceOffset是源偏移,sourceCount为源长度
//target为查找的字符,targetOffset为查找的字符的偏移
//targetCount为查找的字符的长度
//fromIndex表示从源字符的第fromIndex个字符开始查找
static int indexOf(char[] source,int sourceOffset,int sourceCount,
char[] target,int targetOffset,int targetCount,
int fromIndex){
//如果fromIndex比源字符还要长,并且查找的字符长度为0,则返回
//源字符的长度,否则返回-1
if(fromIndex>=sourceCount)
return (targetCount==0?sourceCount:-1);
if(fromIndex<0) fromIndex=0;
//如果fromIndex比源字符短,查找的字符长度为0,直接返
//回fromIndex
if(targetCount==0) return fromIndex;
char first=target[targetOffset];//先取出第一个字符
int max=sourceOffset+(sourceCount-targetCount);
for(int i=sourceOffset+fromIndex;i<=max;i++){
if(source[i]!=first){
while(++i<=max&&source[i]!=first);
}
if(i<max){
int j=i+1;
int end=j+targetCount-1;
for(int k=targetOffset+1;j<end&&source[j]==target[k];j++,k++){
if(j==end)
return i-sourceOffset;
}
}
}
return -1;
}
indexOf只要看他的查找方法,先找到第一个,再匹配剩下的。