当前位置: 首页 > 知识库问答 >
问题:

不可变集合天生效率低吗

潘高洁
2023-03-14

不可变对象是无法更改状态的对象。它们更容易测试和调试,在并发编程中非常有用。然而,与可变集合的亲属相比,当前的不可变集合实现的性能较差。例如,将关联数组实现为不可变的红黑树时,平均有O(log(n))个Insert/Delete,而哈希表平均有O(1)个Insert/Delete。

总的来说,不可变集合是否比它们的可变表亲效率低,或者有一天我们会找到同样快的不可变实现?

共有1个答案

燕意蕴
2023-03-14

冈崎证明,通常可以开发“具有同等渐近性能”的不变数据结构,作为它们的必要对应物。然而,不可变结构的常数可能更差。但是,你可能会为性能付出代价,但你确实会在程序员的时间里得到回报;正如您所说,使用和理解不可变集合要容易得多。这样一来,这个问题就有点类似于一个反复出现的问题,即在C语言如此之快的情况下,我们为什么要使用其他语言。因为这更容易,我们重视程序员的时间。

 类似资料:
  • 问题内容: 从Java 1.6 Collection Framework文档中 : 不支持任何修改操作(如类别,和)被称为 不可修改的 。[…]额外保证Collection对象中的任何更改都将不可见的Collection被称为 不可变的 。 第二个标准使我有些困惑。鉴于第一个集合是不可修改的,并且假定原始集合引用已被删除,那么第二行中提到的更改是什么?它是指集合中包含的元素的变化,即元素的状态吗?

  • 问题内容: 我指的是Apple的Swift编程指南,以了解如何用Swift语言创建可变/不可变对象(数组,字典,集合,数据)。但是我不明白如何在Swift中创建一个不可变的集合。 我希望在Objective-C中看到以下Swift中的等效项 不变数组 可变数组 不变字典 可变字典 问题答案: 创建不可变数组 第一种方式: 第二种方式: 创建可变数组 将对象追加到数组 辞典 创建不可变字典 创建可变

  • 不可变集合是不可被修改的, 集合的数据项是在创建的时候提供, 并且在整个生命周期中都不可改变. Immutable对象有以下的优点: 对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象 线程安全的:immutable对象在多线程下安全,没有竞态条件 不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis

  • 问题内容: 使用这些JPA属性 Ehcache对于同一查询效率不高, 问题与QueryCache类的namedParameters.hashCode()函数有关,它为同一查询生成了不同的HashCode! 与班级有关 它将为同一Array对象[01,1]生成一个不同的(新)hachCode! 对于数组,此hashCode方法应该是递归的 问题答案: 递归版本完全正常 类org.hibernate.

  • 今天我决定测试一下,结果我惊讶地发现(至少在C#正则表达式引擎中)似乎比其他两个没有太大区别的代码效率要低。下面是我测试输出的10000个由1000个随机字符组成的字符串,其中5077个实际包含一个数字: 这对我来说是一个惊喜,有两个原因,如果有人能给我一些启示,我会很感兴趣: 我本以为范围的实现会比集合的实现效率高得多。 我不能理解为什么比差。除了的简写之外,还有其他内容吗? 下面是测试代码:

  • 问题内容: 我真的很喜欢Java 8流和Guava的不可变集合,但是我不知道如何将两者一起使用。 例如,如何实现将流结果收集到ImmutableMultimap中的Java 8 Collector? 优点:我希望能够提供键/值映射器,类似于Collectors.toMap()的工作方式。 问题答案: 从21版开始,您可以