天天看點

Java源碼___String類(九)

 java.lang.String分析摘要:

<1>join重載方法

<2>toLowerCase重載方法

<3>toUpperCase重載方法

<4>trim()方法

<5>toString()方法

1.join重載方法

 該方法将elements中的字元序列拼接在delimiter的String對象。

public static String join(CharSequence delimiter, CharSequence... elements){
    //該方法如果參數不為null,則傳回參數本身,否則抛出NullPointerException異常
    Objects.requireNonNull(delimiter);
    Objects.requireNonNull(elements);
    StringJoiner joiner = new StringJoiner(delimiter);
    for(CharSequence cs : elements){
        joiner.add(cs);
    }
    return joiner.toString();
}

public static String join(CharSequence delimiter, 
                    Interable<? extends CharSequence> elements){
    Objects.requireNonNull(delimiter);
    Objects.requireNonNull(elements);
    StringJoiner joiner = new StringJoiner(delimiter);
    for(CharSequence cs : elements){
        join.add(cs);
    }
    return joiner.toString();
}
           

這個方法是的屬性有:public公有的、static靜态的。

參數:delimiter

字元序列,String也屬于字元序列

參數:【Object…】elements

字元序列組,用于依次拼接在delimter結尾

參數:【Interable <? extends CharSequence>】elements

實作Interator的對象

傳回值:String類型

傳回值說明:傳回将elements中的字元序列拼接在delimiter的String對象。

 該方法注意點:

實作Interable的類可以調用Interator()方法。

2. toLowerCase重載方法

 該方法的作用是将字元全部轉換成小寫。

public String toLowerCase(){
    return toLowerCase(Locale.getDefault());
}

public String toLowerCase(Locale locale){
    if(locale == null){
        throw new NullPointerExcetpion();
    }

    int firstUpper;
    final int len = value.length;

    //檢查是否需要本身就是大寫,如果是的話就不需要轉
    scan:{
        for(firstUpper = ; firstUpper<len;){
            char c = value[firstUpper];
            if((c>=Character.MIN_HIGH_SURROGATE)
                && (C<=Character.toLowerCase(Character.MAX_HIGH_SURROGATE))){
                int supplChar = codePointAt(firstUpper);
                if(supplChar != Character.toLowerCase(supplChar)){
                    break scan;
                }
                //确定表示指定字元(Unicode代碼點)所需的char值的數目。
                //如果指定字元等于或大于0x10000,則該方法傳回2。否則,該方法傳回1。
                firstUpper += Character.charCount(supplChar);
            }else{
                if(c != Character.toLowerCase(c)){
                    break scan;
                }
                firstUpper++;
            }
        }
        return this;
    }

    char[] result = new char[len];
    int resultOffset = ;

    //結果可能會增長,是以i+resultOffset是結果中的寫入位置。
    System.arraycopy(value, , result, , firstUpper);

    String lang = locale.getLanguage();
    boolean localeDependent = 
            (hljs-string">"tr" || hljs-string">"az" || hljs-string">"lt");
    char[] lowerCharArray;
    int lowerChar;
    int srcChar;
    int srcCount;
    for(int i=firstUpper; i<len; i+=srcCount){
        srcChar = (int)value[i];
        if((char)srcChar >= Character.MIN_HIGH_SURROGATE
            && (char)srcChar <= Character.MAX_HIGH_SURROGATE){
            srcCount = codePointAt(i);
            srcCount = Character.charCount(srcChar);
        }eles{
            srcCount = ;
        }
        if(localeDependent || 
                srcChar=='\u03A3' || //希臘大寫字母西格瑪
                srcChar == '\u0130') {//拉丁文大寫字母I
            lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale);
        }else{
            lowerChar = Character.toLowerCase(srcChar);
        }
        if((lowerChar==Character.ERROR)
                || (lowerChar>=Character.MIN_SUPPLEMENTARY_POINT)){
            if(lowerChar == Character.ERROR){
                lowerCharArray = ConditionalSpecialCasing.toLowerCaseCharArray(
                                    this, i, locale);
            }else if(srcCount == ){
                resultOffset += Character.toChars(lowerChar, result, 
                                    i+resultOffset) - srcCount;
                continue;
            }else{
                lowerCharArray = Character.toChars(lowerChar);
            }
            int maplen = lowerCharArray.length;
            if(mapLen > srcCount){
                char[] result2 = new char[result.length + maplen -srcCount];
                System.arraycopy(result, , result2, , i + resultOffset);
                result = result2;
            }
            for(int x=; x<mapLen;++x){
                result[i+resultOffset+x] = lowerCharArray[x];
            }
            resultOffset += (mapLen - srcCount);
        }esle{
            result[i+resultOffset] = (char)lowerChar;
        }
    }
    return new String(result, , len+resultOffset);
}

           

這個方法是的屬性有:public公有。

參數:locale

國際化對象,裡面存儲了一些國際化的資訊,比如語言方式等

傳回值:String類型

傳回值說明:傳回該字元串的小寫字元序列。

 該源碼的思路是:

<1>如果本身字母就都是小寫的話,傳回this字元串。

<2>如果不是則傳回小寫字元序列

3.toUpperCase重載方法

 該方法會傳回this字元序列轉成大寫的形式。

public String toUpperCase(){
    return toUpper(Locale.getDefault());
}

public String toUpperCase(Locale locale) {
    if (locale == null) {
        throw new NullPointerException();
    }

    int firstLower;
    final int len = value.length;

    /* Now check if there are any characters that need to be changed. */
    scan: {
        for (firstLower =  ; firstLower < len; ) {
            int c = (int)value[firstLower];
            int srcCount;
            if ((c >= Character.MIN_HIGH_SURROGATE)
                    && (c <= Character.MAX_HIGH_SURROGATE)) {
                c = codePointAt(firstLower);
                srcCount = Character.charCount(c);
            } else {
                srcCount = ;
            }
            int upperCaseChar = Character.toUpperCaseEx(c);
            if ((upperCaseChar == Character.ERROR)
                    || (c != upperCaseChar)) {
                break scan;
            }
            firstLower += srcCount;
        }
        return this;
    }

    /* result may grow, so i+resultOffset is the write location in result */
    int resultOffset = ;
    char[] result = new char[len]; /* may grow */

    /* Just copy the first few upperCase characters. */
    System.arraycopy(value, , result, , firstLower);

    String lang = locale.getLanguage();
    boolean localeDependent =
            (lang == "tr" || lang == "az" || lang == "lt");
    char[] upperCharArray;
    int upperChar;
    int srcChar;
    int srcCount;
    for (int i = firstLower; i < len; i += srcCount) {
        srcChar = (int)value[i];
        if ((char)srcChar >= Character.MIN_HIGH_SURROGATE &&
            (char)srcChar <= Character.MAX_HIGH_SURROGATE) {
            srcChar = codePointAt(i);
            srcCount = Character.charCount(srcChar);
        } else {
            srcCount = ;
        }
        if (localeDependent) {
            upperChar = ConditionalSpecialCasing.toUpperCaseEx(this, i, locale);
        } else {
            upperChar = Character.toUpperCaseEx(srcChar);
        }
        if ((upperChar == Character.ERROR)
                || (upperChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
            if (upperChar == Character.ERROR) {
                if (localeDependent) {
                    upperCharArray =
                            ConditionalSpecialCasing.toUpperCaseCharArray(
                                        this, i, locale);
                } else {
                    upperCharArray = Character.toUpperCaseCharArray(srcChar);
                }
            } else if (srcCount == ) {
                resultOffset += Character.toChars(upperChar, result, 
                                        i + resultOffset) - srcCount;
                continue;
            } else {
                upperCharArray = Character.toChars(upperChar);
            }

            /* Grow result if needed */
            int mapLen = upperCharArray.length;
            if (mapLen > srcCount) {
                char[] result2 = new char[result.length + mapLen - srcCount];
                System.arraycopy(result, , result2, , i + resultOffset);
                result = result2;
            }
            for (int x = ; x < mapLen; ++x) {
                result[i + resultOffset + x] = upperCharArray[x];
            }
            resultOffset += (mapLen - srcCount);
        } else {
            result[i + resultOffset] = (char)upperChar;
        }
    }
    return new String(result, , len + resultOffset);
}
           

這個方法是的屬性有:public公有。

參數:locale

國際化對象,裡面存儲了一些國際化的資訊,比如語言方式等

傳回值:String類型

傳回值說明:傳回該字元串的大寫字元序列。

 該源碼的思路是:

<1>如果本身字母就都是大寫的話,傳回this字元串。

<2>如果不是則傳回大寫字元序列

4. trim()方法

 該方法的作用将this字元串中首尾的空字元串除去,然後将其傳回。

public String trim(){
    int len = value.length;
    int st = ;
    char[] val = value;

    while((st<len) && (val[st]<='')){
        st++;
    }
    while((st<len) && (val[len-]<='')){
        len--;
    }
    return ((st>)||(len<value.length))?substring(st,len):this;
}
           

這個方法是的屬性有:public公有。

傳回值:String類型

傳回值說明:傳回該字元串除去首尾空字元的字元串。

 該源碼思路:

<1>用一個st記錄this字元串開始有幾個空字元。

<2>用一個len記錄this字元串結尾處往回數有幾個空字元。

<3>如果st或len有一個大于0,則切割字元串,傳回首尾除去空字元的字元串。

<4>否則傳回this對象。

5. toString()方法

 傳回this對象,即字元串本身的字元。

public String toString(){
    return this;
}
           

這個方法是的屬性有:public公有。

傳回值:String字元串

傳回值說明:傳回this對象。

繼續閱讀