Scala - 不可变集合的 hashCode 缓存

标签 scala caching scala-collections

似乎不可变的 scala 集合不会缓存它们的 hashCode 计算(针对 immutable.HashSet 进行了测试),而是每次都重新计算它。有没有简单的方法来添加这种行为(出于性能原因)?

我考虑过创建一个 immutable.HashSet 的子类来进行缓存,但没有看到任何方法来实现 + 等函数以返回缓存对象。虽然可能与委托(delegate)有关,但这看起来非常丑陋。

最佳答案

我认为在 Scala 中做这种事情的通常方法是这样的
但是,您需要小心只将不可变对象(immutable对象)放入此集合中。这就是为什么 Scala 的内置集合每次都重新计算哈希的原因。因为即使集合是不可变的,那里也可能存在可变对象。

object MySet {
  def apply[A](elems: A*) = new MySet(Set(elems: _*))
  def empty[A] = new MySet(Set.empty[A])
}

class MySet[A](set: Set[A]) extends Set[A] {
  def +(elem: A) = new MySet(set + elem)
  def -(elem: A) = new MySet(set - elem)
  def contains(elem: A) = set.contains(elem)
  def iterator = set.iterator
  override lazy val hashCode = set.hashCode
}

关于Scala - 不可变集合的 hashCode 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18861536/

相关文章:

scala - 这种奇怪的类型[T*]

scala - 具有类型参数限制的 Scala 泛型类的条件方法

perl - 如何从 CGI 中分离进程,以便可以从内存中存储和读取文件?

asp.net - 处理缓存和浏览器后退按钮的最佳方法是什么?

scala - Scala 如何通过基于大小使用不同的类来实现 Map 和 Set 的性能提升?

scala - 如何在spark ml中定义特征列

Scala.js 中的 Javascript 生成器

api - 缓存第三方API调用的最佳做法是什么?

performance-testing - 如何将提取的数据写入加特林文件

generics - 返回相同的集合类型,不同的参数化