gpt4 book ai didi

java - Google guava ImmutableList equals 方法返回与 java.utils.List 不同的结果,破坏了 List-Interface 契约?

转载 作者:行者123 更新时间:2023-12-02 03:46:35 26 4
gpt4 key购买 nike

我刚刚偶然发现了问题,并且不太确定是否遗漏了某些内容,或者某些内容已损坏。

我正在使用谷歌 Guava (19.0)。当我测试 ImmutableLists 的相等性时,发生了一些可疑的事情。

在 ImmutableList 的 Javadoc 中,它说 ImmutableList 实现了 java.util.List 接口(interface) http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableList.html

因此,我假设 ImmutableList 的 equals 方法将遵循 java.util.List 给出的约定,并为相同的列表返回相同的结果

在List.equals()中它说“[...]换句话说,如果两个列表包含相同顺序的相同元素,则它们被定义为相等。此定义确保 equals 方法在 List 接口(interface)的不同实现中正常工作。”

https://docs.oracle.com/javase/6/docs/api/java/util/List.html#equals(java.lang.Object)

现在考虑一下这个小代码示例

    ImmutableList.Builder<String> builder1 = new ImmutableList.Builder<>();
builder1.add("Test1");
List<String> list1 = builder1.build();


ImmutableList.Builder<String> builder2 = new ImmutableList.Builder<>();
builder1.add("Test1");
List<String> list2 = builder2.build();

System.out.println(list1.equals(list2));
//--> false


List<String> defaultList1 = new LinkedList<>();
defaultList1.add("Test1");

List<String> defaultList2 = new LinkedList<>();
defaultList2.add("Test1");

System.out.println(defaultList1.equals(defaultList2));
// --> true

现在,您期望什么输出?

我预计这两个测试都是true。但实际输出却不同。正如预期的那样,java 版本的 equals 返回 true。但 guava 版本返回 false。

如果您现在查看 google immutableList 的 javadoc,它说 equals 方法返回 o1==o2 (这违反了 List-Interface 契约)。所以我明白为什么我的代码示例会这样工作。

我认为这不是谷歌人员的“错误”,而是我对 Iterfaces 和合约的理解有问题

最佳答案

您正在将元素添加到同一个构建器(在您的案例中为 builder1)。见下文。所以builder2实际上没有任何东西并且hance等于return false。

ImmutableList.Builder<String> builder1 = new ImmutableList.Builder<>();
builder1.add("Test1"); // builder1
List<String> list1 = builder1.build();


ImmutableList.Builder<String> builder2 = new ImmutableList.Builder<>();
builder1.add("Test1"); // again builder1
List<String> list2 = builder2.build();

System.out.println(list1.equals(list2));
//--> false


List<String> defaultList1 = new LinkedList<>();
defaultList1.add("Test1");

List<String> defaultList2 = new LinkedList<>();
defaultList2.add("Test1");

System.out.println(defaultList1.equals(defaultList2));
// --> true

关于java - Google guava ImmutableList equals 方法返回与 java.utils.List 不同的结果,破坏了 List-Interface 契约?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36242921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com