我正在实现一个
LinkedListDeque
数据结构。我写了一个 equals
方法和一个助手:
o
是否是类 LinkedListDeque
的实例。如果属实的话o
中的每个节点是否等于this
双端队列中的节点。我写了一个助手,因为我需要一种方法来在
2
中两个 LinkedListDeque
对象之间而不是在 this
双端队列和 o
object
之间进行比较操作。当我第一次编写 equals_helper 方法时,我在类型声明中省略了括号。测试过,没用。 IDE 建议我在类型声明两边加上括号(即 equals_helper(LinkedListDeque o)
到 equals_helper((LinkedListDeque) o)
),并且 that 有效。
我试图找到一些关于我在这里所做的事情的文档,但我没有背景知识来知道我在寻找什么。 这个概念叫什么,我是否在 Java OOP 原则的背景下正确应用了它,是否有更好的方法来做到这一点?
public boolean equals(Object o) {
if (!(o instanceof LinkedListDeque)) {
return false;
} else {
return this.equals_helper((LinkedListDeque) o);
}
}
public boolean equals_helper(LinkedListDeque L) {
if (L.size() != this.size()) {
return false;
} else {
Node orig_curr = sentinel.next;
Node curr = L.sentinel.next;
while (orig_curr.item != null || curr.item != null) {
if (orig_curr.item == curr.item) {
curr = curr.next;
orig_curr = orig_curr.next;
} else return curr.next.item == null && orig_curr.next.item == null;
}
}
return true;
}
由于
equals
的参数属于 Object
类型,因此您需要将其转换为您想要使用的类型。在这种情况下LinkedListDeque
。但从 Java 14 开始,您可以按如下方式进行操作:
public boolean equals(Object o) {
if (o instanceof LinkedListDeque lld)) {
return this.equals_helper(lld);
}
return false;
}
如果
instanceof
返回 true,它会自动转换为正确的类型并放置在 lld
中,然后可以使用。不需要显式转换。
注意:您应该首先检查对象是否相同。
if(this == obj) return true;
当你覆盖 equals 时,也覆盖
hashCode
是一个好习惯。