一、基本介紹
Java中的字元串是不可變對象,不能像數組一樣通過下標來修改指定位置的字元。substring方法可以從一個字元串中截取一部分子串,返回一個新的字元串對象,可以基於原始字元串對象創建一個新的不可變字元串。
Java substring方法的語法如下:
public String substring(int beginIndex) public String substring(int beginIndex, int endIndex)
字元串中字元的下標從0開始,beginIndex參數指定要截取的子串的起始字元的下標,endIndex參數指定要截取的子串的最後一個字元的下標加1,即`[beginIndex, endIndex)`表示一個左閉右開區間。如果省略第二個參數,則表示截取從beginIndex到字元串的最後一個字元的子串。
二、截取子串
截取原始字元串中的一部分作為新字元串,是substring方法最基本的功能,常用於在處理字元串時獲取字元串中某個區間的子串。以下是一個簡單的示例:
String str = "hello, world"; String substr1 = str.substring(0, 5); System.out.println(substr1); // 輸出hello String substr2 = str.substring(7); System.out.println(substr2); // 輸出world
在以上代碼中,將原始字元串str中從0到5的字元截取下來作為子串,得到新的字元串substr1,輸出hello;將原始字元串str中從7到最後一個字元的字元截取下來作為子串,得到新的字元串substr2,輸出world。
三、字元串共享
Java中的字元串為了避免重複創建對象,採用了共享字元串對象的方式來節省內存。在實際編程中需要注意這個特點,特別是對於截取子串這個操作,需要理解共享的本質。以下是一個示例:
String str = "hello, world"; String substr = str.substring(0, 5); System.out.println(str == substr); // 輸出false
在以上代碼中,原始字元串str和截取後得到的子串substr不是同一個對象,輸出了false。這是因為子串是通過創建新的字元串對象來實現的,與原始字元串分別佔用內存空間。但是,如果我們截取的子串與原始字元串完全重合,Java中採用的是共享對象的方式,共享的本質是子串對象與原始字元串對象指向的是同一個char數組,不同的是子串對象引用了數組的一部分,原始字元串對象引用了整個數組。如果要比較兩個字元串對象是否相等,需要使用equals方法,不能直接使用==運算符。
String str = "hello, world"; String substr = str.substring(0, 5); String substr2 = str.substring(0, 5); System.out.println(substr == substr2); // 輸出true
在以上代碼中,將原始字元串str中從0到5的字元截取下來作為子串substr和substr2,由於兩個子串的字元完全相同,Java採用了共享的方式,substr和substr2指向同一個對象,輸出了true。
四、異常處理
使用substring方法時需要注意邊界問題,如果beginIndex或endIndex的取值超出了字元串的實際範圍,則會報字元串索引越界異常(StringIndexOutOfBoundsException),需要使用try-catch語句來處理異常。以下是一個示例:
String str = "hello, world"; try { String substr = str.substring(0, 100); // 報異常:StringIndexOutOfBoundsException } catch (StringIndexOutOfBoundsException e) { e.printStackTrace(); }
在以上代碼中,我們嘗試從原始字元串中截取從0到100的字元,由於超出了實際字元範圍,導致字元串索引越界異常,可以在try-catch語句塊中處理異常,避免程序崩潰。
五、不可變字元串
Java中的字元串是不可變的對象,無法修改原始字元串中的字元,使用substring方法獲得的子串也同樣是不可變的,不能通過下標修改其中的字元,要在處理字元串時需要反覆截取子串,每次都需要創建新的字元串對象,會產生大量的內存垃圾。以下是一個具體的示例:
String str = "hello, world"; for (int i = 0; i < str.length(); i++) { String substr = str.substring(0, i + 1); System.out.println(substr); }
在以上代碼中,我們從開頭逐漸截取字元串中的字元,輸出所有可能的子串。由於Java中字元串是不可變的對象,每次截取都會創建新的字元串對象,需要消耗大量的內存,併產生大量的內存垃圾。如果處理的字元串較長,需要減少內存消耗和垃圾產生,可以考慮使用可變字元串(StringBuilder或StringBuffer)。
六、可變字元串
可變字元串是Java中的一種特殊字元串類型,可以隨時修改其中的字元,而不會像不可變字元串那樣每次修改都需要創建新的字元串對象。Java提供了兩種可變字元串類型,分別是StringBuilder和StringBuffer,二者差異較小,都可以用於修改字元串。以下是一個示例:
StringBuilder builder = new StringBuilder("hello, world"); builder.setCharAt(0, 'H'); builder.append(", Java"); String str = builder.toString(); System.out.println(str);
在以上代碼中,我們創建了一個StringBuilder對象,將其初始化為”hello, world”,然後使用setCharAt方法將第一個字元修改為大寫的H,再使用append方法追加了一個字元串”, Java”,最後使用toString方法將StringBuilder對象轉化為字元串對象。與不可變的字元串不同,使用可變字元串可以直接修改字元,避免了創建新對象的開銷。
七、小結
Java substring方法是字元串處理中常用的方法之一,可以從一個字元串中截取一部分作為新字元串使用。使用時需要注意邊界問題,避免字元串索引越界異常的發生。Java中的字元串是不可變對象,無法直接修改其中的字元,經常反覆截取字元串會產生大量的內存垃圾,可以考慮使用可變字元串來代替不可變字元串。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/229116.html