对象类的equals()和==

时间:2013-08-13 09:05:20

标签: java

我有枚举模拟类。主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");
        }
    }
}

7 个答案:

答案 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)

If you see the docs of equls

  

类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true)。

答案 6 :(得分:0)

==总是用来检查引用相等,但是equals()用来检查引用指向的值。 读取String类以深入理解它。(字符串池)