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只要看他的查找方法,先找到第一个,再匹配剩下的。

上一篇下一篇

猜你喜欢

热点阅读