Redian新闻
>
请教一段代码,关于hashCode()
avatar
请教一段代码,关于hashCode()# Java - 爪哇娇娃
h*a
1
代码如下:
import java.util.*;
class MapEQ {
public static void main(String[] args) {
Map m = new HashMap();
ToDos t1 = new ToDos("Monday");
ToDos t2 = new ToDos("Monday");
ToDos t3 = new ToDos("Tuesday");
m.put(t1, "doLaundry");
m.put(t2, "payBills");
m.put(t3, "cleanAttic");
System.out.println(m.size());
} }
class ToDos{
String day;
ToDos(String d) { day = d; }
public boolean equals(Object o) {
return ((ToDos)o).day == this.day;
}
//public int hashCode() { return 9; }
}
如果注释掉最后一行 //public int hashCode() { return 9; },output 是 3
如果加上最后一行, output 是 2
请解释两种情况的差异,谢谢!
avatar
z*3
2
会调用object.hashcode
根据虚拟机对象本身的identity来返回hashcode
同一台虚拟机的不同对象自然会返回不同的hashcode
avatar
h*a
3
谢谢!
但是在注释掉最后一行的情况下,我check了t1,t2,t3的hashCode(), 它们返还同样的
数值(都是1743911840),请问这是怎么回事? 当然加上最后一行的情况下,t1,t2,
t3的hashCode()值均是9 (as expected)。
还有就是如果t1.hashCode()不等于t2.hashCode(),但是t1.equals(t2) return true,
这样可以吗?但是我记得是如果t1和t2的hashCode()不同,必然t1.equals(t2) return
false.
还请指教

【在 z*******3 的大作中提到】
: 会调用object.hashcode
: 根据虚拟机对象本身的identity来返回hashcode
: 同一台虚拟机的不同对象自然会返回不同的hashcode

avatar
z*3
4
i really dont think so
public class Test {
public static void main(String[] args) {
Map m = new HashMap();
ToDos t1 = new ToDos("Monday");
ToDos t2 = new ToDos("Monday");
ToDos t3 = new ToDos("Tuesday");
m.put(t1, "doLaundry");
m.put(t2, "payBills");
m.put(t3, "cleanAttic");
System.out.println(t1.hashCode());
System.out.println(t2.hashCode());
System.out.println(t3.hashCode());
}
}
class ToDos{
String day;
ToDos(String d) { day = d; }
public boolean equals(Object o) {
return ((ToDos)o).day == this.day;
}
//public int hashCode() { return 9; }
}
---
2022447186
898690386
1036828151


return

【在 h*******a 的大作中提到】
: 谢谢!
: 但是在注释掉最后一行的情况下,我check了t1,t2,t3的hashCode(), 它们返还同样的
: 数值(都是1743911840),请问这是怎么回事? 当然加上最后一行的情况下,t1,t2,
: t3的hashCode()值均是9 (as expected)。
: 还有就是如果t1.hashCode()不等于t2.hashCode(),但是t1.equals(t2) return true,
: 这样可以吗?但是我记得是如果t1和t2的hashCode()不同,必然t1.equals(t2) return
: false.
: 还请指教

avatar
h*a
5
谢谢,是我弄错了。但是第二个问题是,在最后一行被注释掉的情况下,t1和t2的
hashCode()不同,但是有t1.equals(t2) return true, 这样岂不是Map里面有两个key
是相同的了?还是说只要t1和t2是指向两个不同的object,这样就算两个不同的key,
而不是由equals method 所决定的?
然而在最后一行加入的情况下,t1,t2的hashCode()相同(=9),并且t1.equals(t2)
return true,程序判定t1和t2是相同的key,这符合是equals决定t1,t2是否为相同的
key
似乎两种情况有些矛盾?

【在 z*******3 的大作中提到】
: i really dont think so
: public class Test {
: public static void main(String[] args) {
: Map m = new HashMap();
: ToDos t1 = new ToDos("Monday");
: ToDos t2 = new ToDos("Monday");
: ToDos t3 = new ToDos("Tuesday");
: m.put(t1, "doLaundry");
: m.put(t2, "payBills");
: m.put(t3, "cleanAttic");

avatar
o*i
6
因为你写的代码是不符合java“规范”的
java里,这个equals和hashcode是相互联系的,如果t1.equals(t2) true,那么t1和t2的
hashcode()必须也相等的
If two objects are equal according to the equals(Object) method, then callin
g the hashCode method on each of the two objects must produce the same integ
er result.
这就是为什么这两个method要同时override

key

【在 h*******a 的大作中提到】
: 谢谢,是我弄错了。但是第二个问题是,在最后一行被注释掉的情况下,t1和t2的
: hashCode()不同,但是有t1.equals(t2) return true, 这样岂不是Map里面有两个key
: 是相同的了?还是说只要t1和t2是指向两个不同的object,这样就算两个不同的key,
: 而不是由equals method 所决定的?
: 然而在最后一行加入的情况下,t1,t2的hashCode()相同(=9),并且t1.equals(t2)
: return true,程序判定t1和t2是相同的key,这符合是equals决定t1,t2是否为相同的
: key
: 似乎两种情况有些矛盾?

avatar
h*a
7
谢谢,但是在这种不符合规范的情况下我想弄清楚到底是equals()还是hashCode()决定
了t1,t2是否是相同的Map key.
我的理解是,如果t1,t2的hashCode()的值是不同的,程序就会认为t1,t2就是不同的
key(当然这可能不符合规范),这时就不再用equals()来判定了。如果t1,t2的
hashCode()值是相同的,再用t1.equals(t2)来判定,如果ture, t1,t2就是相同的key
,如果false, t1,t2就是不同的key。
不知道我的理解是否正确?

t2的
callin
integ

【在 o***i 的大作中提到】
: 因为你写的代码是不符合java“规范”的
: java里,这个equals和hashcode是相互联系的,如果t1.equals(t2) true,那么t1和t2的
: hashcode()必须也相等的
: If two objects are equal according to the equals(Object) method, then callin
: g the hashCode method on each of the two objects must produce the same integ
: er result.
: 这就是为什么这两个method要同时override
:
: key

avatar
c*e
8
直接t1.equals(t2)不就得了,何必先hashcode,再equals().

key

【在 h*******a 的大作中提到】
: 谢谢,但是在这种不符合规范的情况下我想弄清楚到底是equals()还是hashCode()决定
: 了t1,t2是否是相同的Map key.
: 我的理解是,如果t1,t2的hashCode()的值是不同的,程序就会认为t1,t2就是不同的
: key(当然这可能不符合规范),这时就不再用equals()来判定了。如果t1,t2的
: hashCode()值是相同的,再用t1.equals(t2)来判定,如果ture, t1,t2就是相同的key
: ,如果false, t1,t2就是不同的key。
: 不知道我的理解是否正确?
:
: t2的
: callin

avatar
h*a
9
在符合规范的情况下是这样的。
比如在最后一行被注释的情况下(见原例子),t1.equals(t2) return true, 但是t1
,t2的hashCode()不同,程序还是认为t1,t2是不同的key

【在 c*********e 的大作中提到】
: 直接t1.equals(t2)不就得了,何必先hashcode,再equals().
:
: key

avatar
c*e
10
ToDos t1 = new ToDos("Monday");
ToDos t2 = new ToDos("Monday");
m.put(t1, "doLaundry");
m.put(t2, "payBills");
t1.equals(t2) return true ?

t1

【在 h*******a 的大作中提到】
: 在符合规范的情况下是这样的。
: 比如在最后一行被注释的情况下(见原例子),t1.equals(t2) return true, 但是t1
: ,t2的hashCode()不同,程序还是认为t1,t2是不同的key

avatar
c*e
11
你自己把equals(),hashcode()override了,那能怪谁?
public boolean equals(Object o) {
return ((ToDos)o).day == this.day;
}
public int hashCode() { return 9; }

t1

【在 h*******a 的大作中提到】
: 在符合规范的情况下是这样的。
: 比如在最后一行被注释的情况下(见原例子),t1.equals(t2) return true, 但是t1
: ,t2的hashCode()不同,程序还是认为t1,t2是不同的key

avatar
h*a
12
是的,我check过了

【在 c*********e 的大作中提到】
: ToDos t1 = new ToDos("Monday");
: ToDos t2 = new ToDos("Monday");
: m.put(t1, "doLaundry");
: m.put(t2, "payBills");
: t1.equals(t2) return true ?
:
: t1

avatar
z*e
13

key
正确

【在 h*******a 的大作中提到】
: 谢谢,但是在这种不符合规范的情况下我想弄清楚到底是equals()还是hashCode()决定
: 了t1,t2是否是相同的Map key.
: 我的理解是,如果t1,t2的hashCode()的值是不同的,程序就会认为t1,t2就是不同的
: key(当然这可能不符合规范),这时就不再用equals()来判定了。如果t1,t2的
: hashCode()值是相同的,再用t1.equals(t2)来判定,如果ture, t1,t2就是相同的key
: ,如果false, t1,t2就是不同的key。
: 不知道我的理解是否正确?
:
: t2的
: callin

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。