簡體   English   中英

Java - 字符串和子字符串方法

[英]Java - Strings and the substring method

我有一些我想知道的問題。 我知道字符串在Java中是不可變的,因此在分配給現有字符串對象時會創建新的字符串對象而不是更改。

現在問我的問題。 我們假設我有以下代碼:

String a = "Hello World";
String b = "Hello World";

String res = a.substring(0,4) + b.substring(6,10);

第3行的代碼將創建多少個字符串對象? 每次調用substring都會創建一個新的字符串對象嗎? 我上面的代碼會生成3個新的字符串對象嗎?

提前致謝

Java中的字符串是不可變的 基本上這意味着,一旦創建了一個字符串對象,您將無法修改/更改字符串的內容。 因此,如果對“似乎”更改字符串內容的字符串對象執行任何操作,Java將創建一個新的字符串對象,並對新創建的字符串對象執行操作。

基於此,上面的代碼似乎創建了五個字符串對象 - 兩個是由聲明創建的,兩個是通過調用substring創建的,最后一個是在連接兩個部分后創建的。

然而,不變性導致另一個有趣的后果。 JVM在內部維護類似字符串池的內容,用於創建字符串文字。 為了節省內存,JVM將嘗試使用此池中的字符串對象。 無論何時創建新的字符串文字,JVM都會循環到池中以查看是否可以使用任何現有字符串。 如果有,JVM將簡單地使用它並返回它。

因此,從技術上講,在Java 7之前,JVM將只為您的整個代碼創建一個字符串對象。 即使你的substring調用也不會在池中創建新的字符串對象,它將使用現有的“Hello World”字符串,但在這種情況下,它只會使用位置0到3的字符,例如第一次調用substring。 從Java 7開始,子字符串不會共享字符,但會創建一個新字符。 因此,總對象數將為4 - 將使用兩個子串的串聯創建最后一個。

編輯要在評論中回答您的問題,請查看Java語言規范 -

在Java編程語言中,與C不同,char數組不是String,並且字符串和char數組都不會被'\\ u0000'(NUL字符)終止。

String對象是不可變的,也就是說,它的內容永遠不會改變,而char數組有可變元素。

類String中的toCharArray方法返回一個包含與String相同字符序列的字符數組。 StringBuffer類在可變字符數組上實現有用的方法。

所以,不,char數組在Java中不是不可變的,它們是可變的。

文字a是新創建的並保存在池中。字母b表示a,它不會創建新的。

第3行將創建3個新的String,因為substring創建了一個新的字符串,並且每次都連接創建新的字符串。

String substring(int beginIndex,int endIndex)

返回一個新字符串,該字符串是此字符串的子字符串。 子字符串從指定的beginIndex開始,並擴展到索引endIndex - 1處的字符。因此子字符串的長度為endIndex-beginIndex。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM