只有一個(gè)參數(shù)的;
String str = new String("ABCD");
System.out.println("str="+str.substring(1));
進(jìn)入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);
}
分析:
- 當(dāng) beginIndex < 0或者 beginIndex > length的時(shí)候娶聘,直接拋出越界異常夷狰;
- 當(dāng) beginIndex 就是0 的時(shí)候,返回原字符串么抗;
- 最后判斷是 isLatin1是否滿足站粟,進(jìn)入StringLatin1/StringUTF16检盼;
進(jìn)入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的構(gòu)成數(shù)組,{A拆又,B茶鹃,C胞谭,D}先蒋;
- int index:beginIndex = 1眯搭;
- int len :subLen = 4 -1 = 3借笙;
再調(diào)用 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 (實(shí)際就是str的長度)沛膳;
- 該方法定義了一個(gè)新的數(shù)組,長度為:length - beginIndex = 3汛聚;
最后調(diào)用:
System.arraycopy
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
分析:
- 參數(shù)1锹安,src ,源數(shù)組 倚舀,傳入 original叹哭,{A,B痕貌,C风罩,D};
- 參數(shù)2 芯侥,srcPos 源數(shù)組的開始位置,傳入 beginIndex = 1乳讥;
- 參數(shù)3柱查, dest ,目標(biāo)數(shù)組云石,傳入是一個(gè)空的 length 為 3的數(shù)組唉工;
- 參數(shù)4,destPos 目標(biāo)數(shù)組的開始位置汹忠,傳入 0淋硝;
- 參數(shù)5,length 需要copy元素的數(shù)量宽菜,本次調(diào)用谣膳,傳遞的是 length - beginIndex = 3(經(jīng)過最小值判斷,仍然等價(jià))
- 結(jié)果:
- copy[0] = original[1]铅乡;
- copy[1] = original[2]继谚;
- copy[2] = original[3];
綜上阵幸,str.subString(i) 實(shí)際上是
- 將 str 轉(zhuǎn)成數(shù)組 array01花履,賦值給一個(gè)為新的數(shù)組 array02,并且array02.length = str.length - i挚赊;
- 賦值過程為:array02[0] = array01[i](直到i = array01.length)
- array02轉(zhuǎn)換新的String诡壁,并返回;
得出結(jié)論:subString(i)返回值是 str的索引位置i荠割,到最大索引(兩個(gè)索引都包括)