一、基本介紹
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-hant/n/229116.html