【问题标题】:.equals() on a PriorityQueue returns unexpected resultsPriorityQueue 上的 .equals() 返回意外结果
【发布时间】:2023-02-05 06:27:42
【问题描述】:

很抱歉,如果这是一个愚蠢的问题(特别是对于使用 Java 开发超过 4 年的人)或者是否已经回答(我已经搜索过堆栈溢出,尽管问题很简单,但我找不到重复)但我创建了两个优先级队列并想检查它们是否以完全相同的顺序包含完全相同的元素。但是,当我在两个看似相等的优先级队列上调用 .equals() 时,我返回了 false。我希望从直接比较 (==) 中得到这么多,而不是从 .equals() 方法中得到。我看过 java 文档,但他们没有对此行为提供解释。

为了测试这种行为,我运行了以下代码段:

PriorityQueue<Character> window = new PriorityQueue<>();
PriorityQueue<Character> base = new PriorityQueue<>();
System.out.println(window.equals(base));
System.out.println(base.equals(base));
window.offer('a');
window.offer('b');
base.offer('a');
base.offer('b');
System.out.println(window.equals(base));

输出是:

false
true
false

但是,我预计:

true
true
true

我之前已经覆盖了 equals 方法,所以如果这是我必须做的事情,我可以处理,但我对结果感到非常吃惊。我知道我可以将我的 PriorityQueue 转换为字符串或数组,然后比较它们,但这破坏了使用 PriorityQueue 的全部意义(更不用说它将占用的所有多余空间)。

【问题讨论】:

    标签: java equals priority-queue hashcode


    【解决方案1】:

    PriorityQueue 的 Javadoc 显示它不提供自己的 equals() 实现,因此继承了 Object 的实现。因此,您只能获得引用相等性,而不是内容相等性。

    【讨论】:

      猜你喜欢
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      相关资源
      最近更新 更多