我有枚举模拟类。主p和pp中的两个对象都通过==
和equals
测试。
p = PacketType.None;
pp = PacketType.None;
并且两者都不打印
p = PacketType.StartOfOperation;
pp = PacketType.None;
方法equals
和运算符==
实际调用了什么?我认为==
不应该通过,因为它必须看看这些对象是否具有相同的指针。换句话说,它应该看起来是同一个对象(在我们的例子中它不是)。
public class PacketType {
String Name = "9";
public static final PacketType None = new PacketType("9");
public static final PacketType StartOfOperation = new PacketType("1");
PacketType(String Name) {
this.Name = Name;
}
public String toString() {
return Name;
}
public static void main(String[] args) {
PacketType p = PacketType.None;
PacketType pp = PacketType.StartOfOperation;
if (p == pp) {
System.out.print("==");
}
if (p.equals(pp)) {
System.out.print("equals");
}
}
}
答案 0 :(得分:1)
应使用对象==
来测试它们是否是对同一对象实例的引用。 .equals(Object o)
应该用于检查它们是否具有相等的值(但是这种行为必须在自定义对象中手动实现,否则默认为==
行为)。
一个很好的例子就是String
人在尝试检查字符串是否相同时,通常会错误地使用==
而不是.equals(Object o)
。
String a = "my string";
String b = "my string";
String c = a;
//Each of these should then evaluate to true
a==c
b!=c
a.equals(b)
b.equals(c)
可以找到equals(Object o)
方法的完整说明here,我找不到等价运算符==
的等价物(This one含糊不清,指的是原语不是对象)。
答案 1 :(得分:1)
您没有override
equals
,在这种情况下,equals
的默认设置为==
。
答案 2 :(得分:0)
他们有点不同。
equals()
类中存在 java.lang.Object
方法,期望检查对象状态的等效性。这意味着,对象的内容。期望==
运算符检查实际对象实例是否相同。
另一个区别是可以覆盖equals()
方法。这样,您可以将其更改为您想要的行为。
答案 3 :(得分:0)
==不应该过表,因为它必须看看这些对象是否具有相同的指针。
如果两个引用指向同一个内存对象,则更正==将传递。
equals()
如果没有重写,也会传递因为equals的默认实现也使用==
检查内存对象是否相等。
作为一种好的做法,我们应该为自定义类重写equals以实际比较两个对象的属性。如果所有属性都相等,则逻辑上两个对象相等。
答案 4 :(得分:0)
我们完全期望None != StartOfOperation
,并且由于您没有覆盖equals
,因此您的类会从Object
类继承它,其实现是
public boolean equals(Object o) { return this == o; }
正如您所看到的,这与==
完全相同。
答案 5 :(得分:0)
类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true)。
答案 6 :(得分:0)
==总是用来检查引用相等,但是equals()用来检查引用指向的值。 读取String类以深入理解它。(字符串池)