Scala HashSet或HashMap实现字符串缓存?

Scala HashSet或HashMap实现字符串缓存?,scala,caching,hashset,Scala,Caching,Hashset,在我当前的代码中,我看到许多字符串ID被缓存为: val idMapping = MMap.empty[String, String] idMapping.put("ID1234", "ID1234") 这被认为是缓存这些唯一ID以进行快速检索的一种有效方法,如- idMapping.get("ID1234") 如果它返回null,那就胡说八道 有更好的替代方案吗?我很容易想到HashSet,但在Scala中我发现很少有基于HashSet的缓存示例 有人能对上述设计提出改进意见吗?用于缓存的

在我当前的代码中,我看到许多字符串ID被缓存为:

val idMapping = MMap.empty[String, String]
idMapping.put("ID1234", "ID1234")
这被认为是缓存这些唯一ID以进行快速检索的一种有效方法,如-

idMapping.get("ID1234")
如果它返回null,那就胡说八道

有更好的替代方案吗?我很容易想到HashSet,但在Scala中我发现很少有基于HashSet的缓存示例


有人能对上述设计提出改进意见吗?

用于缓存的最佳数据结构是WeakHashMap

在您的示例中:

val cache = new WeakHashMap[String, String]

/* … */

val value = cache.getOrElseUpdate(id, generate(id))

WeakHashMap不保护密钥不受垃圾收集的影响,这意味着当它们不再使用并且发生一些垃圾收集时,条目将被自动删除。如果内存不是问题,可以使用mutable.HashMap(
getOrElseUpdate
也可用)。

缓存的最佳数据结构是WeakHashMap

在您的示例中:

val cache = new WeakHashMap[String, String]

/* … */

val value = cache.getOrElseUpdate(id, generate(id))

WeakHashMap不保护密钥不受垃圾收集的影响,这意味着当它们不再使用并且发生一些垃圾收集时,条目将被自动删除。如果内存不是问题,可以使用mutable.HashMap(
getOrElseUpdate
也可用)。

使用
Set
。如果它真的总是一个身份映射,那么
映射
就完全没有必要了。当您使用
get
时,由于创建了
选项
值,它会消耗更多内存,速度也会变慢。同时检查
if(alreadyProcessed(key))
只是看起来比
if(alreadyProcessed.get(key.nonEmpty)

使用
集合。如果它真的总是一个身份映射,那么
映射
就完全没有必要了。当您使用
get
时,由于创建了
选项
值,它会消耗更多内存,速度也会变慢。同时检查
if(alreadyProcessed(key))
看起来比
if(alreadyProcessed.get(key.nonEmpty)

看起来更像是一个“查找”而不是键值缓存。对于缓存,请使用映射,对于查找,请使用集合,或者-如果键和值相同,那么为什么需要查找任何内容而不是按原样使用键?它是为了验证还是什么?集合充当已对其执行操作的ID的存储。如果我们收到一个已经在集合中的ID,我们就忽略它。我只是被使用地图来实现这一点的原因弄糊涂了。这样做是有正当理由的,还是完全错了?它看起来更像是一个“查找”而不是键值缓存。对于缓存,请使用映射,对于查找,请使用集合,或者-如果键和值相同,那么为什么需要查找任何内容而不是按原样使用键?它是为了验证还是什么?集合充当已对其执行操作的ID的存储。如果我们收到一个已经在集合中的ID,我们就忽略它。我只是被使用地图来实现这一点的原因弄糊涂了。这样做可能有正当的理由,还是完全错了?我的问题更多地集中在是否真的需要重复
idMapping.put(“ID1234”,“ID1234”)
?在不将键复制为值的情况下,是否可以有一个快速的散列集合(与Map相当)?我的问题更多地集中在重复类型
idMapping.put(“ID1234”、“ID1234”)
是否真的有必要?可以有一个快速散列集合(类似于Map)而不将键复制为值吗?