Java VAVR收集真的持久吗

Java VAVR收集真的持久吗,java,collections,vavr,Java,Collections,Vavr,我理解,在本文中,持久性是指在试图修改集合时保留其以前的版本: List<Integer> l = List.of(1, 2, 3); List<Integer> l2 = l.append(4); 也许我没有抓住要点?所有vavr收藏都是持久的。没有API方法可以使vavr集合发生变异。这意味着,一旦您持有对vavr集合的引用,就可以确保它不会被代码的任何部分更改(1) API中缺少的实际上是一个问题,而不是一个特性。如果可以查询API以查找集合的所有早期版本,则意味

我理解,在本文中,持久性是指在试图修改集合时保留其以前的版本:

List<Integer> l = List.of(1, 2, 3);
List<Integer> l2 = l.append(4);

也许我没有抓住要点?

所有vavr收藏都是持久的。没有API方法可以使vavr集合发生变异。这意味着,一旦您持有对vavr集合的引用,就可以确保它不会被代码的任何部分更改(1)

API中缺少的实际上是一个问题,而不是一个特性。如果可以查询API以查找集合的所有早期版本,则意味着您将所有早期版本保留在内存中。这将是对资源的巨大浪费,而且会使这些藏品的用处大大降低。当前,如果您不持有对集合早期版本的引用,则允许垃圾收集器释放旧版本使用的内存

如果您想了解某个集合的演化历史,那么必须有代码负责保存和删除对这些集合的引用。这样,您就可以完全控制程序的内存使用



(1) 除了使用反射或类似工具直接修改字段/内存的黑客之外,绕过封装

所有vavr集合都是持久的。没有API方法可以使vavr集合发生变异。这意味着,一旦您持有对vavr集合的引用,就可以确保它不会被代码的任何部分更改(1)

API中缺少的实际上是一个问题,而不是一个特性。如果可以查询API以查找集合的所有早期版本,则意味着您将所有早期版本保留在内存中。这将是对资源的巨大浪费,而且会使这些藏品的用处大大降低。当前,如果您不持有对集合早期版本的引用,则允许垃圾收集器释放旧版本使用的内存

如果您想了解某个集合的演化历史,那么必须有代码负责保存和删除对这些集合的引用。这样,您就可以完全控制程序的内存使用



(1) 除了使用反射或类似工具(允许您直接修改字段/内存)进行的黑客攻击外,绕过对以前版本的封装并不是直接有意的功能


这是不变性的结果。正如图灵85所说,访问以前的版本是完全持久化数据结构的一个特性。

保留以前的版本不是直接有意的特性


这是不变性的结果。正如图灵85所说,访问以前的版本是完全持久化数据结构的一个特性。

这种期望是错误的。“不可变”和“可变”听起来太相似了,所以需要一个新的流行词:“持久”。这种期望是错误的。“不可变”和“可变”听起来太相似了,所以需要一个新的流行词:“持久性”。我认为这就是持久性(历史被保存)的意思,而不是不可变(这意味着什么都不能改变)@AndyCribbens持久性集合不仅仅是不可变的集合,它意味着比像简单的不可变集合那样复制对元素的引用更高效的存储。持久性集合采用结构共享,这通常意味着只有O(1)或O(logn)内存和运行时成本(取决于操作和实际集合类型),而不是简单的不可变集合中通常的O(n)内存和运行时成本。请阅读vavr文档中的详细信息。该文档中提到:“完全持久化的数据结构允许对任何版本进行更新和查询。”这意味着vavr集合是持久化的,但不是“完全持久化的”?我不知道作者对这句话的意思,但如果我不得不猜测,他所说的集合类型具有真正的mutator方法,这些方法可以改变内部状态,但仍然提供一种机制来查看集合的不同版本。老实说,我不知道这种持久性集合的任何实际实现。使用vavr,您无法改变现有集合。您只能基于现有集合创建新集合(可能),并进行其他更新。新的集合将尝试与原始版本共享尽可能多的存储空间。如果您想要这样的集合,您可以轻松地在vavr上实现它。您可以在内部拥有不可变的持久集合值,并且在它们前面有一个可变的Java集合API外观用于更新。您可以在可变Java集合API之上添加查询版本的方法,以便能够查询版本。这当然是可能的,但我更愿意只使用不可变的值。我认为这就是持久性(即保留历史)的含义,而不是不可变的(这意味着什么都不能改变)@AndyCribbens持久性集合不仅仅是不可变的集合,它意味着比像简单的不可变集合那样复制对元素的引用更高效的存储。持久性集合采用结构共享,这通常意味着只有O(1)或O(logn)内存和运行时成本(取决于操作和实际集合类型),而不是简单的不可变集合中通常的O(n)内存和运行时成本。请阅读vavr文档中的详细信息。该文档中提到:“完全持久化的数据结构允许对任何版本进行更新和查询。”这意味着vavr集合是持久化的,但不是“完全持久化的”?我不知道作者对这句话的意思,但如果我不得不猜测,他说的是t系列的类型
l2.getPreviousVersion()