日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用String.intern减少内存使用

發布時間:2025/7/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用String.intern减少内存使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近寫一個程序,從文件中讀取一些字/詞,然后存儲起來供別的類引用。

對每個讀入的詞創建一個String,結果許多同樣內容的也會存儲多份,會占用大量內存。

開始的一個想法是使用map/set來存儲所有遇到的詞,這樣就沒有重復的了。然后別的類只需要引用這些詞就可以了。

這樣還需要一些工作量,經別人介紹,發現了String.intern方法。

例如下面代碼

String a = new String("abc"); String b = new String("abc"); assertNotSame(a, b);

a和b是兩個獨立的對象,它們有各自的存儲。所以not same。

但如果

String a = new String("abc").intern(); String b = new String("abc").intern(); assertSame(a, b);

此時assertSame就會pass。現在a和b其實是一個對象,a == b。它們只是同一個對象的兩個名字。在debug時,可以看到他們的id是一樣的。這樣跟

String a = new String("abc"); String b = a;
assertSame(a, b);

效果是完全一樣的。

intern是一個native的方法,但按照其文檔解釋,應該是JVM維護了一個當前進程曾經出現過的字符串的hash表,在調用intern時,會查詢該表。如果已經存在,則直接返回對該String的引用;如果沒有,則創建一個,并加入到hash中。

在我的代碼中,因為是從文件中讀取的詞,所以只需要在讀取詞后,對每個詞調用下intern再存儲,就可以保證同樣內容的字符串只有一份存儲。更確切的說,只有一個對象。即不僅字符串內容只有一份,其overhead(String類的非內容部分,例如其他成員變量)也只有一份。

另外,如果使用字面量(literal)來定義字符串,則自動會調用intern,從而減少內存占用。例如:

String a = new String("abc"); String b = "abc"; String c = "abc";assertSame(b, c); assertNotSame(a, b);

對于字面量定義的b和c都會自動調用intern,(等用于String b = "abc".intern())。所以此時b和c是指向同一個對象。但a不是字面量定義的,所以是獨立對象。

轉載于:https://www.cnblogs.com/xichengtie/p/3384766.html

總結

以上是生活随笔為你收集整理的使用String.intern减少内存使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。