成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JDK源碼解析string之二

learn_shifeng / 2629人閱讀

摘要:如果起始地址小于或者起始地址所比較對(duì)象長(zhǎng)度大于自身對(duì)象長(zhǎng)度,返回假?gòu)乃容^對(duì)象的末尾開始比較起始比較和末尾比較都是比較經(jīng)常用得到的方法,例如在判斷一個(gè)字符串是不是協(xié)議的,或者初步判斷一個(gè)文件是不是文件,都可以采用這個(gè)方法進(jìn)行比較。

(28) public boolean startsWith(String prefix, int toffset) {

      char ta[] = value;
      int to = toffset;
      char pa[] = prefix.value;
      int po = 0;
      int pc = prefix.value.length;
      // Note: toffset might be near -1>>>1.
      //如果起始地址小于0或者(起始地址+所比較對(duì)象長(zhǎng)度)大于自身對(duì)象長(zhǎng)度,返回假
      if ((toffset < 0) || (toffset > value.length - pc)) {
          return false;
      }
      //從所比較對(duì)象的末尾開始比較
      while (--pc >= 0) {
          if (ta[to++] != pa[po++]) {
              return false;
          }
      }
      return true;
  }

(29) public boolean startsWith(String prefix) {

      return startsWith(prefix, 0);
  }

(30) public boolean endsWith(String suffix) {

      return startsWith(suffix, value.length - suffix.value.length);
  }
 起始比較和末尾比較都是比較經(jīng)常用得到的方法,例如在判斷一個(gè)字符串是不是http協(xié)議的,
 或者初步判斷一個(gè)文件是不是mp3文件,都可以采用這個(gè)方法進(jìn)行比較。

(31) public native String intern();

intern方法是Native調(diào)用,它的作用是在方法區(qū)中的常量池里通過(guò)equals方法尋找等值的對(duì)象,
如果沒(méi)有找到則在常量池中開辟一片空間存放字符串并返回該對(duì)應(yīng)String的引用,
否則直接返回常量池中已存在String對(duì)象的引用

(32) public String toLowerCase() {

    return toLowerCase(Locale.getDefault());
 }

(33) 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 = 0 ; 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 = 1;
            }
            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 = 0;
    char[] result = new char[len]; /* may grow */

    /* Just copy the first few upperCase characters. */
    System.arraycopy(value, 0, result, 0, 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 = 1;
        }
        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 == 2) {
                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, 0, result2, 0, i + resultOffset);
                result = result2;
            }
            for (int x = 0; x < mapLen; ++x) {
                result[i + resultOffset + x] = upperCharArray[x];
            }
            resultOffset += (mapLen - srcCount);
        } else {
            result[i + resultOffset] = (char)upperChar;
        }
    }
    return new String(result, 0, len + resultOffset);
}
將字符串的大寫轉(zhuǎn)換為小寫,將字符串小寫轉(zhuǎn)換為大寫

(34)public char[] toCharArray() {

      char result[] = new char[value.length];
      System.arraycopy(value, 0, result, 0, value.length);
      return result;
  }
將字符串轉(zhuǎn)化為數(shù)組,由于本身就是數(shù)組的形式,只需將其拷貝即可。

(35) public String[] split(String regex, int limit) {

    
    char ch = 0;
    if (((regex.value.length == 1 &&
         ".$|()[{^?*+".indexOf(ch = regex.charAt(0)) == -1) ||
         (regex.length() == 2 &&
          regex.charAt(0) == "" &&
          (((ch = regex.charAt(1))-"0")|("9"-ch)) < 0 &&
          ((ch-"a")|("z"-ch)) < 0 &&
          ((ch-"A")|("Z"-ch)) < 0)) &&
        (ch < Character.MIN_HIGH_SURROGATE ||
         ch > Character.MAX_LOW_SURROGATE))
    {
        int off = 0;
        int next = 0;
        boolean limited = limit > 0;
        ArrayList list = new ArrayList<>();
        while ((next = indexOf(ch, off)) != -1) {
            if (!limited || list.size() < limit - 1) {
                list.add(substring(off, next));
                off = next + 1;
            } else {    // last one
                //assert (list.size() == limit - 1);
                list.add(substring(off, value.length));
                off = value.length;
                break;
            }
        }
        // If no match was found, return this
        if (off == 0)
            return new String[]{this};

        // Add remaining segment
        if (!limited || list.size() < limit)
            list.add(substring(off, value.length));

        // Construct result
        int resultSize = list.size();
        if (limit == 0) {
            while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {
                resultSize--;
            }
        }
        String[] result = new String[resultSize];
        return list.subList(0, resultSize).toArray(result);
    }
    return Pattern.compile(regex).split(this, limit);
}

(36)public String[] split(String regex) {

    return split(regex, 0);
 }

對(duì)于字符串 "boo:and:foo",regex為o,limit為5時(shí),
splite方法首先去字符串里查找regex——o,然后把o做為分隔符,
逐個(gè)把o去掉并且把字符串分開,比如,發(fā)現(xiàn)b后面有一個(gè)o,于是把這個(gè)o去掉,
并且把字符串拆成"b", "o:and:foo"兩個(gè)字符串(注意:b后面的兩個(gè)o已經(jīng)去掉了一個(gè)),
接下來(lái)看"o:and:foo"這個(gè)字符串,第一個(gè)字符就是o,
于是o前面相當(dāng)于一個(gè)空串,把這個(gè)o去掉,"o:and:foo"被分開成"", ":and:foo"這樣兩個(gè)字符串,
以此類推循環(huán)5次就是splite("o", 5)方法的作用

(37) public static String join(CharSequence delimiter, CharSequence... elements) {

    Objects.requireNonNull(delimiter);
    Objects.requireNonNull(elements);
    // Number of elements not likely worth Arrays.stream overhead.
    StringJoiner joiner = new StringJoiner(delimiter);
    for (CharSequence cs: elements) {
        joiner.add(cs);
    }
    return joiner.toString();
 }

(38) public static String join(CharSequence delimiter,

        Iterable elements) {
    Objects.requireNonNull(delimiter);
    Objects.requireNonNull(elements);
    StringJoiner joiner = new StringJoiner(delimiter);
    for (CharSequence cs: elements) {
        joiner.add(cs);
    }
    return joiner.toString();
}
將已給的數(shù)組用給定的字符進(jìn)行分開,返回一個(gè)特定的字符串,例如
String [] strings = {"a","b","c","d"};
 info =  String.join( "a",strings );
 System.out.println( info );
打印的結(jié)果為 aabacad

(39) public static String format(String format, Object... args) {

    return new Formatter().format(format, args).toString();
  }

(40) public static String format(Locale l, String format, Object... args) {

    return new Formatter(l).format(format, args).toString();
  }
  將字符串串格式化為一定格式的形式返回給

(41) 各種各樣的 valueOf(Object obj) 方法

  作用就是將相應(yīng)格式的對(duì)象轉(zhuǎn)換為你字符串的格式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77344.html

相關(guān)文章

  • Spring聲明式事務(wù)管理之二:核心接口API

    摘要:事務(wù)管理結(jié)構(gòu)事務(wù)管理有個(gè)左右,其中最核心的有個(gè),分別是。事務(wù)管理主要結(jié)構(gòu)如下三個(gè)核心接口源碼解析接口是用于定義一個(gè)事務(wù),它定義了事務(wù)管理的五大屬性,在上一篇文章中有詳細(xì)介紹。只需要裝配一個(gè)實(shí)體管理工廠接口的任意實(shí)現(xiàn)。 1.Spring事務(wù)管理API結(jié)構(gòu) ??Spring事務(wù)管理API有100個(gè)左右,其中最核心的API有3個(gè),分別是TransactionDefinition、 ??Pla...

    lykops 評(píng)論0 收藏0
  • 一步一步實(shí)現(xiàn)Tomcat之二——實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Servlet容器

    摘要:注本文使用規(guī)范是規(guī)范中的一個(gè)接口,我們可以自己實(shí)現(xiàn)這個(gè)接口在方法中實(shí)現(xiàn)自己的業(yè)務(wù)邏輯。我們只是實(shí)現(xiàn)一個(gè)簡(jiǎn)單的容器示例,所以和其他方法留待以后實(shí)現(xiàn)。運(yùn)行一下實(shí)現(xiàn)首先編寫一個(gè)自己的實(shí)現(xiàn)類。 前言 經(jīng)過(guò)上一篇文章《一步一步實(shí)現(xiàn)Tomcat——實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web服務(wù)器》,我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的Web服務(wù)器,可以響應(yīng)瀏覽器請(qǐng)求顯示靜態(tài)Html頁(yè)面,本文更進(jìn)一步,實(shí)現(xiàn)一個(gè)Servlet容器,我們不...

    dayday_up 評(píng)論0 收藏0
  • redux源碼分析之二:combineReducers.js

    摘要:歡迎關(guān)注源碼分析系列文章源碼分析之一源碼分析之二源碼分析之三源碼分析之四源碼分析之五文件對(duì)外暴露了一個(gè)函數(shù),函數(shù)是的一個(gè)輔助性的函數(shù),用于拆分里面的第一個(gè)參數(shù)函數(shù)。函數(shù)的返回值是一個(gè)函數(shù),該函數(shù)是組合之后的一個(gè)標(biāo)準(zhǔn)的函數(shù)。 歡迎關(guān)注redux源碼分析系列文章:redux源碼分析之一:createStore.jsredux源碼分析之二:combineReducers.jsredux源碼分...

    big_cat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<