Java源码___String类(四)

java.lang.String分析摘要:
<1>getBytes方法
<2>equals()
<3>contentEquals(StringBuffer sb)
<4>contentEquals(CharSeqence cs)
<5>nonSyncContentEquals(AbstractStringBuulder sb)

1.getBytes方法
 该方法已经过时,因为非英文字母在char转成byte时,会有数据缺失

//【已过时】将字符串的某个节段的char转换成byte,赋给目标byte数组dest
//srcBegin:字符串开始转换的下标
//srcEnd:字符串结束转换的下标(不包含)
//dest[]:目标byte数组
//destBegin:目标byte数组开始复制的位置
@Deprecated
public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) {
    if (srcBegin < 0) {
        throw new StringIndexOutOfBoundsException(srcBegin);
    }
    if (srcEnd > value.length) {
        throw new StringIndexOutOfBoundsException(srcEnd);
    }
    if (srcBegin > srcEnd) {
        throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
    }
    Objects.requireNonNull(dst);

    int j = dstBegin;
    int n = srcEnd;
    int i = srcBegin;
    char[] val = value;   /* avoid getfield opcode */

    while (i < n) {
        dst[j++] = (byte)val[i++];
    }
}


//用指定的编码集将字符串编码,然后将编码后的byte数组返回
//charSetName:字符集名称,用于将字符串编码
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException {
   if (charsetName == null) 
       throw new NullPointerException();
   return StringCoding.encode(charsetName, value, 0, value.length);
}

//使用平台默认的字符集将字符串编码成字节序列,然后将其返回
public byte[] getBytes(){
    return StringCoding.encode(value,0,value.length);
}

该方法的主要作用是:第一个重载方法getBytes(int srcBegin, int srcEnd, byte dest[] , int destBegin)方法中讲字符串编码是按照平台默认的Unicode字符集方法来编码的,并且在转换的过程中,只会保留最低8位的数据,其他数据将会被舍弃。所以这个方法转换成byte是有问题的。
 
2. equals()方法
 equals方法是Object中的方法,这边String类对equals进行了重写。

 public boolean equals(Object anObject){
    //如果比较的对象就是本身的话,返回true
     if(this == anObject){
         return true;
     }
     if(anObject istanceof 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;
                }
            }
        }
     }
     return false;
 }

这个方法是的属性有:public公有。
异常:NullPointerException
异常说明:如果this本身为null的话,调用该方法会抛出空指针异常。
返回值:boolean
返回值说明:如果字符串相等,则返回true,否则返回false

该方法的总结:String类的在调用这个方法的时候,要保证自身不为null,所以我们要自己注意一下,适当地做非null校验。
该源码的思路是:
<1>先判断实参是否属于本身,如果是则返回true。
<2>将实参强转成String对象,如果两者的长度不相等,则返回false。
<3>比较两者的value【char数组】,按顺序比较,一有不相等就返回false。

 

3.contentEquals(StringBuffer sb)
 该方法是将字符串和实参StringBuffer中的缓冲字符进行比较。

 public boolean contentEquals(StrngBuffer sb){
     return contentEquals((charSequence)sb);
 }

这个方法是的属性有:public公有。
返回值:boolean
返回值说明:当且仅当字符串和字符串缓冲实参具有相同字符序列时返回true。

该方法的注意点:该方法会调用contentEquals(charSequence cs)方法,如果传进来的StringBuffer对象,则会进行同步操作,保证多线程数据的安全性。如果传进来的是StringBuilder的话,则不会进行加锁操作保证多线程数据的安全性。
 

4. contentEquals(CharSequence cs)方法

 该方法是比较字符串和实参是否具有相同的字符序列,有且仅当两者相同时返回true。

public boolean contentEquals(CharSequence cs){
    //如果实参StringBuffer或StringBuilder
    if(cs instanceof AbstractStringBuilder){
        if(cs instanceof StringBuilder){
            synchronized(cs){
                return nonSyncContentEquals((AbstractStringBuilder)cs);
            }
        }else{
            return nonSyncContentEquals((AbstractStringBuilder)cs);
        }
    }
    //如果实参是String
    if(cs instanceof String){
        return equals(cs);
    }
    //如果实参是平常的字符序列
    char[] v1 = value;
    int n = v1.length;
    if(n != cs.length()){
        return false;
    }
    for(int i=0; i<n ; i++){
        if(v1[i] != cs.charAt(i)){
            return false;
        }
    }
    return true;
}

这个方法是的属性有:public公有。
返回值:boolean
返回值说明:当且仅当字符串和实参的字符序列相等时返回true,否则返回false。

该方法的主要作用是:比较字符串和实参序列,如果相同,则返回true,否则返回false。
该方法的思路为:
<1>判断传进来的实参是否属于StringBuffer或S他ringBuild,如果是则调用nonSyncContentEquals(AbstractStringBuilder cs)方法。该方法见下个详解。
<2>判断传进来的实参是否属于String类,如果是调用equals()方法返回结果。
<3>判断传进来的实参是否属于普通的字符序列,如果是的话,比较两者的长度,如果长度不等则返回false。
<4>依次判断字符串和实参的字符序列是否相等,如果不等,则返回false。否则返回true。

5. nonSyncContentEquals(AbstractStringBuilder sb)方法

 该方法是用来比较字符串和实参sb是否具有相同的字符顺序。

//该方法是私有的,要注意使用范围
//此方法对StringBuffer同步
private boolean nonSyncContentEquals(AbstractStringBuilder sb){
    char[] v1 = value;
    char[] v2 = sb.getValue();
    int n = value.length;
    if(n != sb.length()){
        return false;
    }
    if(int i=0; i<n ;i++){
        if(v1[i] != v2[i]){
            return false;
        }
    }
}

这个方法是的属性有:private私有。
返回值:boolean
返回值说明:当且仅当字符串和实参的字符序列相等时返回true,否则返回false。

该方法的主要作用是:比较字符串和实参序列,如果相同,则返回true,否则返回false。
该方法的思路为:
<1>判断长度是否相等。
<2>依次判断每个字符是否相等,不相等返回false。
<3>若都不满足,则返回true。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值