返回介绍

数学基础

统计学习

深度学习

工具

Scala

三、集合相等性

发布于 2023-07-17 23:38:22 字数 1674 浏览 0 评论 0 收藏 0

  1. 集合类库对于相等性和哈希的处理方式是一致的。

    • 首先将集合分为 SetMapSeq 等不同类别,不同类别下的集合永远不相等。如 Set(1,2,3)List(1,2,3) 尽管元素完全相同,但是他们不等。

    • 在相同类别下,当且仅当集合拥有相同的元素时,它们才相等。进一步地,对于 Seq,不仅要求包含的元素相同,这些元素的顺序也要相同。

      如:

      
      
      xxxxxxxxxx
      Vector(1,2,3) == List(1,2,3) // true Vector(1,2,3) == List(3,2,1) // false Vector(1,2,3) == Set(1,2,3) // false HashSet(1,2,3) == TreeSet(1,2,3) // true HashSet(1,2,3) == TreeSet(3,2,1) // true
  2. 集合是可变的还是不可变的,并不影响相等性检查。

    • 对于不可变集合而言,两个集合要么一直相等,要么一直不相等。

    • 对于可变集合而言,相等性的判断仅取决于执行相等性检查时刻的元素。这意味着某个时刻两个集合相等,但是下一个时刻这两个集合不相等。

      当我们使用可变集合作为HashMap 的键时,这是一个潜在的坑。

      
      
      xxxxxxxxxx
      import collection.mutable.{HashMap,ArrayBuffer} val buf = ArrayBuffer(1,2,3) val map = HashMap(buf -> 3) map(buf) // 返回 3 buf(0) += 1 map(buf) // 抛出 NoSuchElementException 异常

      这里倒数第二行改变了 buf 的内容,这导致 buf 的哈希码被改变了。因此,基于哈希码的查找操作会指向不同于 buf 的存储位置。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文