Java" =="工作

时间:2014-02-19 16:27:41

标签: java

只是好奇“==”如何在Java中工作? 我创建了两个类ClassObject1ClassObject2,它们都实现了接口I_ClassClassObject1ClassObject2内部,我覆盖hashCode()equals()函数,以确保这两个函数将为这两个类返回完全相同的值。

public interface I_Class {

    public String getName();
}

public class ClassObject1 implements I_Class{

    private String name="";

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ClassObject1 other = (ClassObject1) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public String getName() {
        return this.name;
    }
}
public class ClassObject2 implements I_Class{

    private String name="";

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        ClassObject2 other = (ClassObject2) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public String getName() {
        return this.name;
    }
}

我假设在这种情况下

I_Class obj1 = new ClassObject1();
I_Class obj2 = new ClassObject2();
System.out.println(obj1 == obj2); // I assume here will write true

“==”比较内存地址,不是吗?

4 个答案:

答案 0 :(得分:2)

obj1.hashCode() == obj2.hashCode()并不代表obj1 == obj2。两个对象可以具有相同的hashCodes,没有问题。但最终这些是两个不同的对象,它们不能被判断为相同。

从技术上讲,在Java中,您不应该假设对象的任何低级细节。您无法知道对象的确切内存地址。这就是它在Java中的表现。它与C中的内容不同。

答案 1 :(得分:1)

不,它会打印false==运算符检查两个引用是否都引用同一个对象。在您的情况下,两者都是两个不同的对象。

答案 2 :(得分:0)

由于obj1obj2具有不同的地址,因此会打印错误。

例如

See this discussion on strings

然而,

Behavior regarding autoboxing非常棘手。

答案 3 :(得分:0)

我没有仔细研究过代码,而是

System.out.println(obj1 == obj2); // I assume here will write true

使用

System.out.println(obj1.equals(obj2));

正如你在OP中所说,我认为==比较内存地址,而.equals()将使用你写的equals方法。

祝你好运!