Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap用作缓存时的性能问题_Java_Performance_Caching_Hashmap - Fatal编程技术网

Java HashMap用作缓存时的性能问题

Java HashMap用作缓存时的性能问题,java,performance,caching,hashmap,Java,Performance,Caching,Hashmap,案例1: 一个HashMap,包含100000个条目 案例2: 两个HashMaps,每个有50000个条目 以上哪种情况需要更多的执行时间和内存?或者两者之间存在显著差异 是否可以将一个包含大量条目的HashMap替换为两个包含较少条目的HashMaps?您最好使用一个HashMap 查找在散列映射中非常有效,并且它们被设计为在其中包含大量元素。如果你必须在一张地图上搜索一些东西,然后在第一张地图上找不到它的话,那么在另一张地图上搜索的速度就会变慢 (无论哪种方式,内存使用情况都不会有太大差别

案例1:

一个
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条目的时候遇到问题,那么代码就有一个大问题。 下面是一些关于哈希映射的提示:

  • 不要使用太复杂的对象作为键(在我看来,使用对象字符串作为键是HashMap的最佳选择)
  • 如果您试图使用一些复杂对象作为键,请确保equals和hashCode方法尽可能高效,因为这些方法中的计算量过多会大大降低hashmap的效率

  • 正如大家提到的,你应该使用一个散列映射