簡體   English   中英

Java 字符數組轉字符串而不創建新對象

[英]Java char array to String without creating new objects

創建這樣的字符串時:

String s1 = “ABC”

如果“ABC”存在,JVM 將在字符串池中查找,並且僅當“ABC”尚不存在時才創建新對象。

所以使用

String s1 = new String("ABC")

停止這種行為,每次都會創建一個對象。

現在我在將 char 數組轉換為 String 時遇到問題:

private char[] names;
...
@Override
public String toString() {
  return new String(this.names);
}

這將始終創建一個新對象。 我可以從 char 數組轉換為 String 而不每次都創建新對象嗎?

我知道沒有辦法避免在您的toString()創建String對象,但是您可以通過顯式調用String.intern()來避免保留這些新字符串(除了第一個字符串在方法執行后都符合 GC 條件String.intern()

@Override
public String toString() {
    return new String(this.names).intern();
}

您可以通過反復檢查myObject.toString() == myObject.toString()來測試它。

但在此之前,請幫自己一個忙,並注意自己在做什么 生成字符串對象可能是更好的選擇,這取決於您這樣做的主要原因。

如果您的目標是減少內存使用,您還可以考慮通常存儲在char[] names以及如何在示例中未顯示的其他代碼中操作該成員字段。 char[]切換到String可能會減少內存。

Java 9 引入了緊湊字符串,與需要 UTF16 的String相比,它減少了拉丁String的內部存儲。 因此,在某些情況下, new String(this.names)char[] names使用更少的內存,因為它存儲相同字符的byte[]表示 - 盡管這會導致String額外對象的開銷。 但是 String 可能不適合您訪問names其他操作,特別是如果您需要調用toCharArray()以獲取原始格式以使應用程序像以前一樣工作。

暫無
暫無

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

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