我正在更深入地学习哈希码,并发现:
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比较的是对象的内容;