Java HashMap用作缓存时的性能问题
案例1: 一个Java HashMap用作缓存时的性能问题,java,performance,caching,hashmap,Java,Performance,Caching,Hashmap,案例1: 一个HashMap,包含100000个条目 案例2: 两个HashMaps,每个有50000个条目 以上哪种情况需要更多的执行时间和内存?或者两者之间存在显著差异 是否可以将一个包含大量条目的HashMap替换为两个包含较少条目的HashMaps?您最好使用一个HashMap 查找在散列映射中非常有效,并且它们被设计为在其中包含大量元素。如果你必须在一张地图上搜索一些东西,然后在第一张地图上找不到它的话,那么在另一张地图上搜索的速度就会变慢 (无论哪种方式,内存使用情况都不会有太大差别
HashMap
,包含100000个条目
案例2:
两个HashMap
s,每个有50000个条目
以上哪种情况需要更多的执行时间和内存?或者两者之间存在显著差异
是否可以将一个包含大量条目的
HashMap
替换为两个包含较少条目的HashMap
s?您最好使用一个HashMap
查找在散列映射中非常有效,并且它们被设计为在其中包含大量元素。如果你必须在一张地图上搜索一些东西,然后在第一张地图上找不到它的话,那么在另一张地图上搜索的速度就会变慢
(无论哪种方式,内存使用情况都不会有太大差别。)
如果当前速度太慢,请检查您的
.hashCode()
和.equals()
是否效率低下。您最好使用单个哈希映射
查找在散列映射中非常有效,并且它们被设计为在其中包含大量元素。如果你必须在一张地图上搜索一些东西,然后在第一张地图上找不到它的话,那么在另一张地图上搜索的速度就会变慢
(无论哪种方式,内存使用情况都不会有太大差别。)
如果当前速度太慢,请检查
.hashCode()
和.equals()
是否效率低下。这两种情况的内存要求应该相似(由于HashMap
存储是一个条目数组,其大小是映射的容量,因此两个50K数组占用的空间与一个100K数组相同)
在这两种情况下,get()
和put()
方法也应该具有类似的性能,因为键和匹配索引的哈希代码的计算不受映射大小的影响。唯一可能影响这些操作性能的是
映射到同一索引的平均键数,也应该与映射的大小无关,因为随着大小的增加,Entries数组也会增加,因此每个索引的平均项数应该保持不变
另一方面,如果使用两个较小的映射,则必须添加逻辑来决定使用哪个映射。您可以尝试在第一个映射中搜索键,如果未找到,则在第二个映射中搜索。或者,您可以使用一个条件来确定使用哪个映射(例如,从A到M开始的字符串键将存储在第一个映射中,其余的将存储在第二个映射中)。因此,映射上的每个操作都会有额外的开销
因此,我建议使用单个
HashMap
这两种情况下的内存需求应该是相似的(因为HashMap
存储是一个条目数组,其大小是映射的容量,因此两个50K数组占用的空间与一个100K数组相同)
在这两种情况下,get()
和put()
方法也应该具有类似的性能,因为键和匹配索引的哈希代码的计算不受映射大小的影响。唯一可能影响这些操作性能的是
映射到同一索引的平均键数,也应该与映射的大小无关,因为随着大小的增加,Entries数组也会增加,因此每个索引的平均项数应该保持不变
另一方面,如果使用两个较小的映射,则必须添加逻辑来决定使用哪个映射。您可以尝试在第一个映射中搜索键,如果未找到,则在第二个映射中搜索。或者,您可以使用一个条件来确定使用哪个映射(例如,从A到M开始的字符串键将存储在第一个映射中,其余的将存储在第二个映射中)。因此,映射上的每个操作都会有额外的开销
因此,我建议使用一个
HashMap
使用一个或两个HashMap
之间的性能差异应该无关紧要,所以选择一个更简单的解决方案,即单个HashMap
但既然你问了这个问题,我假设你有性能问题。通常,使用哈希图作为缓存是个坏主意,因为它保存对缓存对象的引用,因此基本上禁用垃圾收集。考虑重新设计缓存,例如使用<代码> SofTeRe>S(标准java API中的一个类),它允许垃圾收集器收集缓存的对象,同时只要对象尚未被垃圾收集,就仍然能够重用这些对象。
使用一个或两个HashMap
之间的性能差异应该没有多大关系,所以选择更简单的解决方案,即单个HashMap
但既然你问了这个问题,我假设你有性能问题。通常,使用哈希图作为缓存是个坏主意,因为它保存对缓存对象的引用,因此基本上禁用垃圾收集。考虑重新设计缓存,例如使用<代码> SofTeRe>S(标准java API中的一个类),它允许垃圾收集器收集缓存对象,同时只要对象尚未被垃圾收集,就可以重用这些对象。
正如大家提到的,您应该使用一个哈希映射。如果您在处理100k条目的时候遇到问题,那么代码就有一个大问题。 下面是一些关于哈希映射的提示:正如大家提到的,你应该使用一个散列映射