Re: [問題] String的intern()有何好處?
※ 引述《shorttime (鄉民)》之銘言:
: 我想問的是...
: 在什麼情況下
: 我們寧願開兩個物件 使用這段code:
: String s1 = new String("XXXX")
: String s2 = new String("XXXX")
: 而不願意使用下列這段code呢?
: String s1 = "XXXX";
: String s2 = "XXXX";
String(String) 這個 constructor 很少需要用到,通常也不會是用在這種
使用 string literal 的情況。
比較多見的用法是在 copy sub-string:
String aLongLongLongString = ...;
String s = new String(aLongLongLongString.substring(10, 20));
用以避免發生 memory leak。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.139.55
推
01/09 17:03, , 1F
01/09 17:03, 1F
推
01/09 17:03, , 2F
01/09 17:03, 2F
String object 大致上是以一個 char array, 兩個數值 offset, count(指明
這個 String object 是使用 char array 的哪個部分)所構成。
String 有個 non-public constructor:
String(int offset, int count, char value[])
可以直接指定這三個要素。所以 String object 之間是有共享 char array 的
情況在。
String - substring method 很合理的一個實做方式就是產生一個共享自己所
持有的 char array 的 String object(sun JRE 1.6 都還是這樣子的作法)。
那麼直接使用 String - substring 的產物在某些時候就會有 memory leak
的情況產生。
String aLongLongLongString = ...; // constructed somewhere
String s = aLongLongLongString.substring(10, 20);
aLongLongLongString = null;
假設這段碼不知道從哪個 module 拿到一個內容很長的 String object,而需要
的只是這個字串的一小部分(透過 substring 操作取得一個小字串)。當原本
建構 aLongLongLongString 所指涉的 String object 的模組已經不再需要使用
到這個很長的字串而拿掉這個 strong reference,上面的片段碼只需要 s 所指涉
的小字串,但因為 s 指涉的 String object 持有一個 reference 到
aLongLongLongString 內部持有的 char array,導致這個 char array 一直
不能夠被回收。
sun JRE 所實做的 String(String) constructor 會檢查:假如 actual
argument(a String object) 所使用的部分(count) 比其內部持有的 char array
length 來的小,那麼 String constructor 裡就只 copy offset:count 指定的
那一段 char sequence 到新的 char array,constructing object 使用這個新
且較小的 char array 而不使用 actual argument 內部的 char array。因此
String s = new String(aLongLongLongString.substring(10, 20));
可以避免 aLongLongLongString 指涉的 String object 內部的 char array
無法被回收。
有興趣的人可以稍微看一下 sun JRE java.lang.String 的 source code,會
比較清楚我所描述的事情。
* 希望各位不要誤會,這一篇沒有暗示「要使用 sub-string 前一定要先建構
一個副本 String object」。
推
01/09 18:18, , 3F
01/09 18:18, 3F
推
01/09 19:06, , 4F
01/09 19:06, 4F
推
01/09 19:58, , 5F
01/09 19:58, 5F
推
01/09 21:09, , 6F
01/09 21:09, 6F
推
01/09 21:11, , 7F
01/09 21:11, 7F
→
01/09 21:16, , 8F
01/09 21:16, 8F
→
01/09 21:19, , 9F
01/09 21:19, 9F
推
01/09 21:57, , 10F
01/09 21:57, 10F
※ 編輯: sbrhsieh 來自: 218.173.139.55 (01/09 22:13)
推
01/09 22:34, , 11F
01/09 22:34, 11F
推
01/10 12:49, , 12F
01/10 12:49, 12F
推
01/10 19:20, , 13F
01/10 19:20, 13F
推
01/11 08:33, , 14F
01/11 08:33, 14F
推
01/12 12:57, , 15F
01/12 12:57, 15F
※ weii:轉錄至看板 SFFamily 01/14 12:53
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 5 篇):