美文网首页
JDK源码分析一

JDK源码分析一

作者: 蛮大人我们走 | 来源:发表于2017-01-12 15:20 被阅读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只要看他的查找方法,先找到第一个,再匹配剩下的。

    相关文章

      网友评论

          本文标题:JDK源码分析一

          本文链接:https://www.haomeiwen.com/subject/xdndbttx.html