HashMap的两个实例之间的区别<String,String>和HashMap的一个实例<String,Object>其中Object包含两个字符串

yok*_*uki 2 java hashmap

为简单起见,假设我有两个实例HashMap<String, String>,它们共享相同的密钥.我想知道的是,它之间存在性能和内存差异,并且表示这两个StringObject并将其存储在中HashMap<String, Object>.

我的实际问题是使用一个实例HashMap<String, HashSet<String>>和两个实例,HashMap<String, Double>我希望通过合并它们,我会以某种方式节省内存,但我不确定使用自定义Object与本机对象是否会对性能产生影响喜欢HashSetDouble作为价值观.

Bri*_*ian 5

哈希值是根据字符串计算出来的,因此不会产生速度影响.从长远来看,空间影响(非常轻微的增加)可以忽略不计.如果它使代码更清晰,那么就去做并搞砸性能(只要我们不谈论巨大的性能瓶颈,就没关系).

速度

对于速度影响,请记住,在a中HashMap<String, ?>,String是什么被哈希.实际上,您可能会看到速度略有增加,因为与3次查找相比,您只需要执行一次查找来查找自定义对象.

空间

对于空间影响,请记住HashMap使用内部数组,其大小为2的幂.如果您只HashMap使用没有特殊设置(如自定义加载因子)的香草,那么您可能会看到空间略有增加,因为现在您已经拥有(大致当然,这只是简化):

HashSet<String>[]
Double[]
Double[]
Run Code Online (Sandbox Code Playgroud)

结合后,你就可以了

CustomObject[]
    HashSet<String>
    Double
    Double
Run Code Online (Sandbox Code Playgroud)

这忽略了不随地图增长的恒定大小信息.对象占用的空间不仅仅是对其字段的引用,而且不是很多.

易读性

自定义对象选项赢得了这一点.它更干净,非常OOP,非常适合Java.无论性能如何,无论如何都应该这样做.从长远来看,它看起来会更好,并且更易于维护.

例如,如果要向自定义对象添加字段,那很容易.但是拥有单独的地图意味着为更多变量创建更多地图,这是很脏的.我说去OOP方式.