![](/img/trans.png)
[英]Compare two regions of char array in Java without creating new objects
[英]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.