[英]Reuse hashmaps in array
我拿着一個哈希表數組,我想獲得最大的性能和內存使用率,所以我想在一個數組中恢復哈希表。
因此,當數組中不再有哈希表並且我想要向該數組中添加新的哈希表時,我只需清除哈希表並使用put()來添加新值。
當我從數組中撤回哈希圖時,我還需要復制回值。
我不確定這是否比每次創建new HashMap()
更好。 什么是更好的?
UPDATE
需要循環約5000萬個哈希圖,每個哈希圖具有約10個鍵值對。 如果數組的大小為20,000,我只需要20,000哈希圖,而不是5000萬個新的hashmaps()
使用這種方法時要非常小心。 盡管從性能上考慮回收對象可能更好,但是您可能會多次修改相同的引用而遇到麻煩,如下例所示:
public class A {
public int counter = 0;
public static void main(String[] args) {
A a = new A();
a.counter = 5;
A b = a; // I want to save a into b and then recycle a for other purposes
a.counter = 10; // now b.counter is also 10
}
}
我確定你明白了,但是,如果不從數組中復制對HashMaps的引用,那應該沒問題。
沒關系 過早的優化。 當有探查器結果告訴您實際在哪里花費最大內存或CPU周期時,請返回
完全不清楚為什么以這種方式重新使用映射會提高性能和/或內存使用率。 就我們所知,這可能沒有什么不同,或者可能產生相反的效果。
您應該對可讀性最高的代碼進行任何處理,然后進行概要分析,最后優化概要分析器突出顯示為瓶頸的代碼部分。
在大多數情況下,您不會有任何區別。
通常,地圖條目的數量比地圖對象的數量大得多。 填充地圖時,將為每個條目創建Map.Entry
實例。 這是一個重量較輕的對象,但是無論如何您都要調用new
。 沒有數據的地圖本身也是輕量級的,因此,除非您的地圖可以容納1-2個條目,否則您將不會從這些技巧中獲得任何好處。
底線。 忘記過早的優化。 實施您的應用程序。 如果您在應用程序性能方面遇到問題,請找出瓶頸並進行修復。 我可以99%向您保證,瓶頸永遠不會出現在new HashMap()
調用中。
我認為您想要的是一種對象池,您可以從對象池中獲取一個對象(在您的情況下為HashMap),執行操作,如果不再需要該對象,則將其放回池中。
檢查對象池設計模式,以獲取更多參考,請檢查此鏈接:
您遇到的問題是,大多數對象都是HashMap中的Map.Entry對象。 雖然可以回收HashMap本身(及其數組),但這些只是對象的一小部分。 解決此問題的一種方法是使用來自javolution的FastMap,它回收所有內容並支持管理生命周期(其目的是通過這種方式最大程度地減少垃圾)
我懷疑最有效的方法是即使沒有使用大多數字段,也可以使用EnumMap(如果您知道鍵屬性)或POJO。
重用HashMap
存在一些問題。
Map.Entry
對象也將控制內存使用率,但不會被重用(除非您做了一些特殊的事情)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.