SFFamily 板


LINE

※ [本文轉錄自 java 看板] 作者: sbrhsieh (偶爾想擺爛一下) 看板: java 標題: Re: [問題] String的intern()有何好處? 時間: Sat Jan 9 16:45:02 2010 ※ 引述《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
1F:推 PsMonkey:可以解釋一下為甚麼這樣可以避免 memory leak 嗎? 01/09 17:03
2F:推 PsMonkey:直接 assign substring() 會出什麼問題? @_@? 01/09 17:03
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」。
3F:推 weiyucsie:推一個:) 01/09 18:18
4F:推 PsMonkey:還真的是不說不知道,受教了 Orz 01/09 19:06
5F:推 darkk6:推一個,不說真的不會想到。 01/09 19:58
6F:推 freesamael:Java 好奧妙...XD 01/09 21:09
7F:推 shorttime:意思是..String s 會指涉到char array 所以memory leak? 01/09 21:11
8F:→ shorttime:恩 多謝指教 01/09 21:16
9F:→ shorttime:更正 String s指到char array記憶區塊的某一小部份 01/09 21:19
10F:推 sppgenius:看到才想起來之前上課時老師有說過Orz 01/09 21:57
※ 編輯: sbrhsieh 來自: 218.173.139.55 (01/09 22:13)
11F:推 KanoLoa:XD 怎會知道這種東西 01/09 22:34
12F:推 silver8250:大推! 01/10 12:49
13F:推 TonyQ:有學到東西有推 XD 01/10 19:20
14F:推 superlubu:有受有推 :D 01/11 08:33
15F:推 chrisQQ:推! 01/12 12:57
-- 我愛用UD 我希望Blizzard可以讓nec招換出來的骷髏兵強壯一點 最好身高一米九 一拳三百磅 不然骷髏兵實在太廢~ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.117.169







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP