簡體   English   中英

HashMap的兩個實例之間的區別 <String, String> 和HashMap的實例 <String,Object> 其中對象包含兩個字符串

[英]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與諸如HashSetDouble這樣的本機對象作為值會對性能產生影響。

哈希是根據字符串計算得出的,因此不會對速度造成影響。 從長遠來看,對空間的影響(很小的增加)可以忽略不計。 如果它使代碼更清晰易懂,則可以這樣做並提高性能(只要我們沒有在談論巨大的性能瓶頸,就沒關系)。

速度

為了提高速度,請記住,在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM