的如何將字符串管理的實際執行不應該是間接在Java中,除了保證:
- 串x =「喜」; String y =「hi」; //保證x == y
- String x =「hi」; String y = new String(「hi」); ==雖然可能不保證== =
- String x = new String(「hi」); String y = new String(「hi」); //保證!=但x.equals(y)
- String x =「hi」; String y = new String(「hi」)。intern(); //保證X ==Ÿ
這些都是,String.intern()
和字符串常量(String x = "hi"
)中對分配給字符串規則....
在過去的(這將Java8改變)內存模型中的PermGen空間。
因此,他們有不同的GC機制,並且即使您有大量可用堆空間(PermGen是/通常小於128MB),如果您使用了String.intern()
,也有可能導致內存不足。
以new String(....)
分配的字符串在其他常規堆上,並且具有標準的GC機制。
至於爲什麼你/我們使用new String ("...")
來創建字符串的新實例,我只能想到一個地方只有這樣做纔有意義,也就是說,如果有人想使用結果對象作爲同步鎖。這在調試事物時是有意義的.....但沒有多大意義。你必須使用'new',這樣你纔不會像其他代碼一樣使用相同的String對象來進行同步。
在一般的Java編程實踐中,我通常沒有見過使用new String ("....")
的人。事實上,人們大多隻使用字符串連接運算符等。但是,這並不意味着它是錯誤的當我看到String的源代碼時,我發現代碼在很大程度上依賴於String是不可變的。所以,例如,新的String(new String(「hi」));只創建一個char數組,並且它在兩個String實例中共享。 (並且內部實例無論如何都將是GC'd)。