String類的subString(i)方法(基于jdk 1.9)

只有一個參數的;

String str = new String("ABCD");
System.out.println("str="+str.substring(1));

進入substring()

public String substring(int beginIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        int subLen = length() - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        if (beginIndex == 0) {
            return this;
        }
        return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen)
                          : StringUTF16.newString(value, beginIndex, subLen);
}

分析:

  • 當 beginIndex < 0或者 beginIndex > length的時候,直接拋出越界異常;
  • 當 beginIndex 就是0 的時候,返回原字符串;
  • 最后判斷是 isLatin1是否滿足,進入StringLatin1/StringUTF16;

進入StringLatin1.newString

public static String newString(byte[] val, int index, int len) {
        return new String(Arrays.copyOfRange(val, index, index + len),
                          LATIN1);
}

分析:

  • byte[] val : 也就是str的構成數組,{A,B,C,D};
  • int index:beginIndex = 1;
  • int len :subLen = 4 -1 = 3;

再調用 Arrays.copyOfRange

public static byte[] copyOfRange(byte[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        byte[] copy = new byte[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

分析:

  • byte[] original:還是{A,B,C,D};
  • int from : index = 1;
  • int to :index + len = 1 + 3 = 4 (實際就是str的長度);
  • 該方法定義了一個新的數組,長度為:length - beginIndex = 3;

最后調用:
System.arraycopy

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

分析:

  • 參數1,src ,源數組 ,傳入 original,{A,B,C,D};
  • 參數2 ,srcPos 源數組的開始位置,傳入 beginIndex = 1;
  • 參數3, dest ,目標數組,傳入是一個空的 length 為 3的數組;
  • 參數4,destPos 目標數組的開始位置,傳入 0;
  • 參數5,length 需要copy元素的數量,本次調用,傳遞的是 length - beginIndex = 3(經過最小值判斷,仍然等價)
  • 結果:
    • copy[0] = original[1];
    • copy[1] = original[2];
    • copy[2] = original[3];

綜上,str.subString(i) 實際上是

  1. 將 str 轉成數組 array01,賦值給一個為新的數組 array02,并且array02.length = str.length - i;
  2. 賦值過程為:array02[0] = array01[i](直到i = array01.length)
  3. array02轉換新的String,并返回;

得出結論:subString(i)返回值是 str的索引位置i,到最大索引(兩個索引都包括)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,775評論 0 33
  • 一、 1、請用Java寫一個冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨云閱讀 1,421評論 0 6
  • 在編寫程序的過程中,不了避免的要用到字符串,所以String類的常用方法的用法是必須掌握的。學習一個類的使用方法最...
    Geg_Wuz閱讀 1,302評論 0 4
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,973評論 19 139
  • 很多事,就像兩個玻璃缸里的魚,互相羨慕。出國也是如此。 沒出國的沒移民的羨慕國外的。對未來未見的憧憬總是美好的,其...
    阿好在德國閱讀 877評論 4 20