【问题标题】:Scala - hashCode caching for immutable collectionsScala - 不可变集合的 hashCode 缓存
【发布时间】:2013-09-18 10:04:08
【问题描述】:

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

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

【问题讨论】:

    标签: scala caching scala-collections


    【解决方案1】:

    我认为在 Scala 中做这种事情的通常方法是这样的 但是,您需要小心只将不可变对象放入此集合中。这就是为什么 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
    }
    

    【讨论】:

    • 打败我!根据您的代码,您也可以只包装 set/map 键,在这种情况下您只需要担心 equalshashCode
    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2013-08-30
    • 2011-11-24
    • 2017-01-14
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多