当前位置: 首页 > 面试题库 >

==运算符和equals()有什么区别?(使用hashcode()???)

拓拔骁
2023-03-14
问题内容

我正在更深入地学习哈希码,并发现:

1.如果覆盖equals(),则也必须覆盖hashcode()。

2.要查找2个对象是否为同一对象,请使用==运算符

考虑到这两个因素,在Java中,我假设== operator使用什么来比较 两个实例是否相同,

if(object1 == object2)

实际上在做

if(object1.hashcode() == object2.hashcode())

但是通过运行下面的测试,似乎我错了。

public class Main {

    public static void main(String[] args){
        Obj1 one = new Obj1();
        Obj1 two = new Obj1();
        //is this calling hashCode() in backend???
        if(one == two) {
            System.out.println("same");
        }
        else {
            System.out.println("nope");
        }
        //this is of course return true
        if(one == one) {
            System.out.println("one and one is same");
        }
    }
}

class Obj1 {
    @Override
    public int hashCode() {
        System.out.println("hashCode() is called");
        return 111;
    }
    @Override
    public boolean equals(Object another) {
        System.out.println("equals() is called");
        return false;
    }
}

根据使用== operator并查看是否equals()调用的测试。

所以我的问题是,如果== operator可以用来比较对象是否相同,覆盖e quals()hashCode()比较方法的目的是什么?还没== operator做这份工作吗?

参考:

http://mindprod.com/jgloss/hashcode.html

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Object)


问题答案:

==运算符确定2个引用是否指向同一对象。

所以

 Object o1 = new Object();
 Object o2 = o1;

 o1 == o2; //true

 o2 = new Object();

 o1 == o2 // false

Object.equals()方法是“如何确定对两个不同对象的引用是否相等?”

如果两个引用指向同一对象,则两者

o1 == o2 
o1.equals(o2)

应该是真的。

但是,如果o1和o2不是同一对象,则它们在逻辑上仍 可能
相等。对于任何给定的类,均等取决于对象背后的语义。例如,考虑一个类,其中用户设置了field1和field2,但计算了field3并对其计算具有随机元素。在这种情况下,定义等于仅取决于field1和field2而不是field3可能是有意义的。这就是为什么平等是必要的。



 类似资料:
  • 问题内容: 和之间有什么区别?它们都创建一个类的实例,我不确定它们之间有什么区别。 问题答案: 在操作创建一个是静态已知的(在编译时),并可以调用你想创建对象的任何构造一个类型的新对象。这是创建对象的首选方式- 快速且JVM对它进行了许多积极的优化。 是一个动态构造,用于查找具有特定名称的类。它比使用速度慢,因为无法将对象的类型硬编码到字节码中,并且因为JVM可能必须执行权限检查以确保您有权创建对

  • 问题内容: Java中的和运算符有什么区别? 问题答案: 是算术右移,是逻辑右移。 在算术移位中,将扩展符号位以保留数字的符号性。 例如:用8位表示的将是(因为最高有效位的权重为负)。使用算术移位将其右移一位,你将得到1。但是,逻辑右移并不关心该值是否可能表示带符号的数字;它只是将所有内容移至右侧,并从左侧填充0。使用逻辑移位将右移一位将得到。

  • 问题内容: JavaScript代码: Java代码: 为什么?我已经阅读了文档,但没有发现不同。如何将JavaScript代码移植到Java? 问题答案: 两者都是合乎逻辑的右移,但JavaScript在处理数字方面有些怪异。通常,JavaScript中的数字为浮点数,但按位运算会将其转换为无符号的32位整数。因此,即使该值看起来不应更改,它也会将数字转换为32位无符号整数。 您看到的值与相同,

  • 问题内容: 我今天换了讲师,他对我说了奇怪的代码。(他说最好用,当我问为什么时,他回答“因为是!”) 所以这是一个例子: 而不是我习惯的: 两者之间有什么区别。为什么他的方式(使用)更好? 通过快速搜索发现了这一点,但我无法真正理解该答案: 问题答案: 在Java中,总是只比较两个引用(对于非原始元素),即,它测试两个操作数是否引用同一对象。 但是,该方法可以被覆盖-因此两个不同的对象仍然可以相等

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 我应该在TSQL中使用!=或<>表示不相等吗? 如果我使用一个简单的表,例如: 两者都给我: 那么和mysql运算符有什么区别? 问题答案: 它们完全相同。请参阅文档。 http://dev.mysql.com/doc/refman/5.0/en/comparison- operators.html#operator_not-

  • 对于基本类型,==比较的是值; 对于引用类型,==比较的是地址; equals不能用于基本类型的比较; 如果没有重写equals,equals就相当于==; 如果重写了equals方法,equals比较的是对象的内容;