java String 源码分析<三> 常用方法分析length,isEmpty,charAt,concat,startsWith

String常用方法源码分析。

String构造方法,支持多种初始化方法,包括接收String,char[],byte[],StringBuffer等多种参数类型的初始化方法。但本质上,其实就是将接收到的参数传递给全局变量value[]。

length()返回此字符串的长度。

public int length() {
//字符串长度即数组value的长度
        return value.length;
    }

isEmpty()判断当前字符串长度是否为0。


    public boolean isEmpty() {
    //数组长度为0则说明字符串是否为空
        return value.length == 0;
    }

charAt(int index) 返回 char指定索引处的值。


    public char charAt(int index) {
    //判断索引是否越界 
        if ((index < 0) || (index >= value.length)) {
        //越界抛出异常
            throw new StringIndexOutOfBoundsException(index);
        }
        //返回索引位置的字符 
        return value[index];
    }

concat(String str)将指定的字符串连接到该字符串的末尾。

   public String concat(String str) {
   //获取形参str字符串的长度
        int otherLen = str.length();
        //长度为0 返回当前对象
        if (otherLen == 0) {
            return this;
        }
        //判读当前对象字符串的长度
        int len = value.length;
        //复制指定的数组value,
        //用零填充到指定长度( len + otherLen)
        
        char buf[] = Arrays.copyOf(value, len + otherLen);
        //buf 包含当前对象value数组的值,后面的填充0
        //注意是形参str对象的getChars方法
        str.getChars(buf, len);
        //重新以buf创建一个新对象并返回
        return new String(buf, true);
    }
      void getChars(char dst[], int dstBegin) {
      //将指定源数形参的value组中的数组从指定位置0复制到目标数组dst的指定位置。复制的字符串的长度位value.length
      //注意因为是str.getChar(),所有当前value为str对象的value值
        System.arraycopy(value, 0, dst, dstBegin, value.length);
    }

startsWith(String prefix, int toffset) 方法

startsWith(String prefix, int toffset) 方法:测试在指定索引处开始的此字符串的子字符串是否以指定的前缀开头。
下面这两个方法都是调用的上面的方法
startsWith(String prefix)方法:测试此字符串是否以指定的前缀开头。
endsWith(String suffix)方法:测试此字符串是否以指定的后缀结尾。

 public boolean startsWith(String prefix) {
 //默认从0位置查找
        return startsWith(prefix, 0);
    }
 public boolean startsWith(String prefix, int toffset) {
 //当前string对象的value备份给ta;
        char ta[] = value;
        //从开始位置查找备份给to
        int to = toffset;
        //获取前缀的char数组
        char pa[] = prefix.value;
        //前缀po索引位置,从0开始
        int po = 0;
        //前缀字符的长度,作为循环次数
        int pc = prefix.value.length;
        //判断开始查找位置不能小于0,这个防止用户写成小于0的值,也因为endsWith需要此判断
        /
        //而且开始查找位置不能大于(字符串的长度-前缀的长度)
        //因为如果从开始位置到最后字符的长度<前缀的长度,肯定就不符合条件
        //这两个判断必须要有,否则下面循环就会数组下标越界的可能
        if ((toffset < 0) || (toffset > value.length - pc)) {
        //开始查找位置没在字符串指定的长度范围查找就返回false
            return false;
        }
        //前缀长度作为循环次数,递减,大于0就继续循环
        //因为前缀长度的个数就是我们比较的次数
        while (--pc >= 0) {
        //字符串从指定的位置递增
        //前缀从0位置递增
        //依次判读是否相等
        //只要一个字符不相等,就说明该字符串没有以指定的前缀开头
            if (ta[to++] != pa[po++]) {
                return false;
            }
        }
        //前缀长度递减小于0,说明判断所有字符都相等
        //返回true
        return true;
    }
     public boolean endsWith(String suffix) {
     //举个例子
     // stirng字符串12个字符  
     //后缀字符串5个字符   
     //我们查找判断位置应该从 倒数第5个字符查找到最后
     //所以查找位置为value.length - suffix.value.length
     //当然value长度可能<suffix长度,这肯定就返回false,
     //所以startsWith()方法有判断(toffset < 0)
     
        return startsWith(suffix, value.length - suffix.value.length);
    }

小编自己看文章太多方法列出来就不会看,所以只列出5个
后续请看
java String 源码分析<四> 常用方法分析indexOf方法分析

文章参考转载:
http://www.516tool.com/java/27.html
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容