String源码理解分析

    String的使用很广泛,基本哪里都会碰见他的踪影,所以我对String进行一次较为深入的学习,并且记录下来,希望帮助到大家。本片博客主要是自己的String方法的使用,以及个别方法的源码剖析,希望能与大家共同进步。

public char charAt(int index):获取第几个字符。

String method_c = new String(“ ABCDEF”);

System.out.println(method_c.charAt(1));             //B

源码:判断下标有没有溢出,返回下标所指引的值。

public char charAt(int index) {

    if ((index < 0) || (index >= value.length)) {

        throw new StringIndexOutOfBoundsException(index);

    }

    return value[index];

}

public int offsetByCodePoints(int index, int codePointOffset):index是下标,codePointOffset是偏移量。

public int codePointAt(int index):返回下标所指引的字符的Unicode码。

String method_c = new String("ABCDEF");

System.out.println(method_c.codePointAt(1)); //66

源码:判断有没有溢出,调用Character.codePointAtImpl()返回Unicode码

public int codePointAt(int index) {

    if ((index < 0) || (index >= value.length)) {

        throw new StringIndexOutOfBoundsException(index);

    }

    return Character.codePointAtImpl(value, index, value.length);

}

int codePointBefore(inr index):返回下标index-1的字符Unicode码。

String method_c = new String("ABCDEF");

System.out.println(method_c.codePointBefore(1)); //65

源码:这里很明显看到对象是针对index-1来判断是否溢出。

public int codePointBefore(int index) {

    int i = index - 1;

    if ((i < 0) || (i >= value.length)) {

        throw new StringIndexOutOfBoundsException(index);

    }

    return Character.codePointBeforeImpl(value, index, 0);

}

int compareTo(String antherString):返回的是第一个有差异的字符的Unicode的差值。若无差异,返回字符串长度差。

String method_c = new String(“ ABCDEF”);

System.out.println(method_c.compareTo( “DBCdEF”)); // - 3

源码:一遇到有差异的字符则立即返回他们的统一码的差值。

 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;
    }

public int compareToIgnoreCase(String str) :忽略大小写之后再进行比较,比较差异,第一个字符差异马上返回差值。 

String method_c = new String("ABCDEF");
System.out.println(method_c.compareToIgnoreCase("bbcdeF")); //-1 

 public String concat(String str):在尾部添加拼接字符串。

String method_c = new String("ABCDEF");
System.out.println(method_c.concat("GHIJ"));

源码:用字符串先开辟一个char[]字符数组,再将新的字符串添加到char[]中,再用这个合并的字符数组创建一个新的字符串对象。

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

 public boolean contains(CharSequence s):判断是否包含该字符,区别大小写

String method_c = new String(“ ABCDEF”);
System.out.println(method_c.contains("F"));     //true
System.out.println(method_c.contains("f"));     //false

public boolean contentEquals(CharSequence cs):true如果这个 String表示与指定序列相同的char值序列. 

System.out.println(method_c.contentEquals("ABCDEF")); //true
System.out.println(method_c.contentEquals("aBCDEF")); //false

源码:就是先比较一下长度,再比较一下每个字符是否相等。

public boolean contentEquals(StringBuffer sb):只是参数类型换了,而且他的源码只是强转一下数据类型然后就调用上一个方法的源码。 

public boolean equals(Object anObject) :这是大家最熟悉的比较内容的方法了

System.out.println(method_c.equals("ABCDEF")); //true

源码;首先比较是否引用同一个内存地址,如果不是则将两个字符串转成char[],再逐一比较。

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

public boolean startsWith(String prefix):判断是否以某个字符开头。 

public boolean startsWith(String prefix, int toffset):从某个位置开始,判断是否为某个字符开头。

public boolean endsWith(String suffix):判断是否以该字符结尾。

System.out.println(method_c.endsWith("F")); //ture

源码:就是将字符串的取值定在对比字符串的开头,再调用startsWith的源码进行处理。

public boolean endsWith(String suffix) {
    return startsWith(suffix, value.length - suffix.value.length);
}

 public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin):这个就是复制字符串的的某些部分到char[]指定的位置中去,可以替换char[]的某些字符。

char[] chars = new char[6];
//String开始复制的位置,String结束复制的位置,char[],开始插入的位置。 
method_c.getChars(0,6,chars,0);
System.out.println(chars);//ABCDEF

 public int hashCode():返回一个hash值,之后就不知道有什么用了。

System.out.println(method_c.hashCode());//1923910755

public int indexOf():返回顺序查找到第一个的char或者String的下标。 

public int lastIndexOf():返回逆序查找到第一个的char或者String的下标。

public boolean isEmpty():判断是不是为空值,源码是判断长度是否为0,所以“  ”这种只有空格的字符串的返回值是false。

public boolean regionMatches(int toffset, String other, int ooffset,int len):原字符串的起始位置,对比的字符串,对比字符串的起始位置,对比长度。   比较某一范围的内容是否相同。

String method_c = new String("ABCDEF");
System.out.println(method_c.regionMatches(1,"ABF",1,2));//false

public boolean regionMatches(boolean ignoreCase, int toffset,String other, int ooffset, int len):相上面的那个就是会不会忽略大小写的影响。 

public String[] split(String regex):按某字符分隔开字符串。注意:. 以小数点作为分隔符会失败的。

public String[] split(String regex, int limit) ::按某字符分隔开字符串,后面一个参数limit是限定分割成几块的。注意:. 以小数点作为分隔符会失败的。

public String substring(int beginIndex):分割某个位置到最后的子字符串。以创建一个新的String进行返回。

public String substring(int beginIndex, int endIndex) :分割某一段区域的子字符串。以创建一个新的String进行返回。

public String trim():去除字符串两边的空格。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值