直接上结论(,小实验,大神绕行,鄙视勿喷。)
向hashmap中相继放入两键值对,(o1->”1st”)、(o1->”2ed”)
| O1\o2 equals | O1\o2的hashcode相等 | Map的大小 | 最后的结果 |
第一种情况 | 是 | 是 | 1 | (o1->”2ed”) |
第二种情况 | 否 | 是 | 2 | (o2->”2ed”) |
第三种情况 | 是 | 否 | 2 | (o1->”1st”)、(o1->”2ed”) |
第二种情况:集合类发生严重错误
第三种情况:不满足要求
至此,理顺了equals和hashcode
更进一步:HashMap中put与get的实现:http://blog.csdn.net/zfq642773391/article/details/5491862
//可看可不看/
实验1:相继插入两个(键值对象equals并且hashcode相等)的键值对,键对象不被覆盖,值对象会被覆盖。
Hashmap的键值的类型:当属性i相同时,其equals,且hashcode相等
package map;
publicclass O {
private String i; private String msg;
public String getI() { returni; }
publicvoid setI(String i) { this.i = i; }
public String getMsg() { returnmsg; }
publicvoid setMsg(String msg) { this.msg = msg; }
@Override publicboolean equals(Object obj) { if (obj == null) { returnfalse; } if (!(obj instanceof O)) { returnfalse; } final O o = (O) obj; returnthis.getI() == o.getI();
}
@Override publicint hashCode() { returnthis.getI().hashCode(); //return super.hashCode(); }
}
|
测试一下:
package map;
import java.util.HashMap; import java.util.Map;
publicclass T {
publicstaticvoid main(String[] args) {
Map<O, String> map = new HashMap<O, String>();
O o1 = new O(); O o2 = new O(); o1.setI("1"); o1.setMsg("i am o1"); o2.setI("1"); o2.setMsg("i am o2");
map.put(o1, "1st"); map.put(o2, "2ed");
}
}
|
结果:
///
实验2:相继插入两个(键值对象不equals而hashcode相等)的键值对,
1、Map的size为2,然而其中只有一个键值对。
2、第一个被放入的键值对完全被第二个代替
package map;
publicclass O {
private String i; private String msg;
public String getI() { returni; }
publicvoid setI(String i) { this.i = i; }
public String getMsg() { returnmsg; }
publicvoid setMsg(String msg) { this.msg = msg; }
// @Override // public boolean equals(Object obj) { // if (obj == null) { // return false; // } // if (!(obj instanceof O)) { // return false; // } // final O o = (O) obj; // return this.getI() == o.getI(); // // }
@Override publicboolean equals(Object obj) { returnsuper.equals(obj); }
@Override publicint hashCode() { returnthis.getI().hashCode(); //return super.hashCode(); } }
|
结果
1、Map的size为2,然而其中只有一个键值对。
2、第一个被放入的键值对完全被第二个代替
///
实验2:相继插入两个(键值对象equals而hashcode不等)的键值对,两个键值对都被放进去了。
package map;
publicclass O {
private String i; private String msg;
public String getI() { returni; }
publicvoid setI(String i) { this.i = i; }
public String getMsg() { returnmsg; }
publicvoid setMsg(String msg) { this.msg = msg; }
@Override publicboolean equals(Object obj) { if (obj == null) { returnfalse; } if (!(obj instanceof O)) { returnfalse; } final O o = (O) obj; returnthis.getI() == o.getI();
}
@Override publicint hashCode() { //return this.getI().hashCode(); returnsuper.hashCode(); }
}
|