当两个对象在A类中具有相同的ele
值时,那两个对象是相等的。所以我重写了toString和hashCode来返回对象的ele
(不考虑任何地方s
的值)。
public class A {
private int ele;
private String s;
public int getEle() {
return ele;
}
public void setEle(int ele) {
this.ele = ele;
}
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
@Override
public int hashCode(){
return ele;
}
@Override
public String toString() {
return String.valueOf(ele);
}
}
public static void main(String[] args) {
Map<A, String> map = new HashMap<>();
A a1 = new A();
a1.setEle(10);
a1.setS("abc");
A a2 = new A();
a2.setEle(10);
a2.setS("efg");
map.put(a1, "val1");
map.put(a2, "val2");
System.out.println(map.get(a1));
System.out.println(map.get(a2));
}
输出:
val1
val2
但是,如果我将a1
和a2
的值放在地图中,我希望val1
或val2
都可以返回map.get(a1)
和map.get(a2)
agc-before-draw
。
答案 0 :(得分:7)
当然,a1
和a2
具有相同的哈希码,但它们并不被认为是相同的,因为您没有覆盖equals
来考虑两个{{1}具有相同A
的对象是相等的。在使用哈希码后,映射将使用ele
与最终标尺相等。地图会将两个对象放在同一个存储桶中,但由于它们不相等,所以它们都会保留两者。
覆盖equals
,以便在另一个对象为equals
时返回true
并且它们都具有相同的A
。然后,您会看到两个ele
来电都会返回val2
。
答案 1 :(得分:1)
在添加到地图时,您需要实现equals()以考虑ele
值,即:
public class A {
private int ele;
private String s;
public int getEle() {
return ele;
}
public void setEle(int ele) {
this.ele = ele;
}
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
A a = (A) o;
return ele == a.ele;
}
@Override
public int hashCode() {
return ele;
}
}
这将使您只返回一个值。
答案 2 :(得分:0)
每次使用new
关键字时,都会在object
内存中生成新的heap
。因此,a1
和a2
实际上都是不同的对象。