![](/img/trans.png)
[英]Check if Object is instance of String, HashMap, or HashMap[ ]
[英]Difference between two instances of HashMap<String, String> and an instance of HashMap<String,Object> where Object contains the two Strings
為簡單起見,假設我有兩個HashMap<String, String>
實例,它們共享相同的鍵。 我想知道的是,在Object
表示這兩個String
值並將它們存儲在HashMap<String, Object>
之間在性能和內存上存在差異。
我的實際問題是使用一個HashMap<String, HashSet<String>>
實例和兩個HashMap<String, Double>
實例,我希望通過合並它們,以某種方式節省內存,但是我不確定是否存在使用自定義Object
與諸如HashSet
或Double
這樣的本機對象作為值會對性能產生影響。
哈希是根據字符串計算得出的,因此不會對速度造成影響。 從長遠來看,對空間的影響(很小的增加)可以忽略不計。 如果它使代碼更清晰易懂,則可以這樣做並提高性能(只要我們沒有在談論巨大的性能瓶頸,就沒關系)。
速度
為了提高速度,請記住,在HashMap<String, ?>
, String
是要進行哈希處理的東西。 實際上,您可能會看到速度有所提高,因為與3次查找相比,您只需要做一次查找即可找到您的自定義對象。
空間
對於空間影響,請記住, HashMap
使用的內部數組的大小為2的冪。如果您僅使用香草HashMap
,沒有像自定義加載因子這樣的特殊設置,那么您可能會看到空間略有增加,因為現在您有(當然,這只是簡化了):
HashSet<String>[]
Double[]
Double[]
合並后,您將擁有
CustomObject[]
HashSet<String>
Double
Double
這將忽略不隨地圖增長的恆定大小的信息。 對象占用的空間比對它們的字段的引用要多,但不是很多。
易讀性
自定義對象選項將贏得這一殊榮。 它更干凈,而且非常面向對象,非常非常適合Java。 無論性能如何,您都應該這樣做。 從長遠來看,它將看起來更好,並且更易於維護。
例如,如果您想向自定義對象添加字段,那很簡單。 但是擁有單獨的映射意味着為更多的變量創建更多的映射,這很臟。 我說走面向對象的方式。
如果要組合它們,請創建一個類來表示它們並具有它們的映射:
public class Stuff {
String a;
String b;
// other fields - maybe the double you mentioned
}
HashMap<String, MyStuff> map;
這肯定會節省內存,因為您的地圖條目會更少。
但是,無論如何,這是正確的方法。 設計時間不是擔心微小的性能和內存影響的時間。 使您的代碼易於閱讀和使用,您的生活(和代碼)會更好。
除非您要處理大量條目,否則差異(如果有)可能不重要。 它還將與平台(JVM版本,Java庫版本等)緊密地聯系在一起,因此,您唯一有用的答案將是針對每種不同的運行方式運行的探查器。
您可以考慮查看Guava Multimap 。 它可能是解決您問題的更干凈的方法。 如果失敗,我將使用自定義對象。 每次代碼清晰都反對過早的優化。
通過合並表,可能會在許多方面帶來更好的收益。 快速地,您只需要計算哈希值並遍歷哈希鏈一次即可,而不是兩次。 對於空間,您只需要一個哈希表而不是兩個哈希表(如果負載系數約為50%,則每個條目可節省約8個字節)和一個哈希鏈而不是兩個(每個哈希表對象可保存約16個字節)。 您要支付對對象的費用,但這最多為16個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.