Java - 覆盖 hashCode 和 toString
Java - Overriding hashCode and toString
当两个对象在 class A 中具有相同的 ele
值时,这两个对象是相等的。所以我已经将 toString 和 hashCode 覆盖为 return 对象的 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
被 returned map.get(a1)
和 map.get(a2)
。
当然,a1
和 a2
具有相同的哈希码,但它们不被视为相等,因为您没有覆盖 equals
来考虑两个 A
ele
相同的对象相等。地图在使用哈希码后将使用 equals
到最终平等的统治者。地图会将两个对象放在同一个桶中,但因为它们不相等,所以它会同时保留两个对象。
覆盖 equals
以便它 returns true
如果另一个对象是 A
并且它们具有相同的 ele
。然后你会看到 val2
将返回给两个 get
调用。
每次使用 new
关键字时,它都会在 heap
内存中创建一个新的 object
。所以,a1
和 a2
实际上都是不同的对象。
有关 new
关键字 What New keyword do Internally in Java
的更多信息,请参阅此内容
您需要实施 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;
}
}
这将使您return只需要一个值。
当两个对象在 class A 中具有相同的 ele
值时,这两个对象是相等的。所以我已经将 toString 和 hashCode 覆盖为 return 对象的 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
被 returned map.get(a1)
和 map.get(a2)
。
当然,a1
和 a2
具有相同的哈希码,但它们不被视为相等,因为您没有覆盖 equals
来考虑两个 A
ele
相同的对象相等。地图在使用哈希码后将使用 equals
到最终平等的统治者。地图会将两个对象放在同一个桶中,但因为它们不相等,所以它会同时保留两个对象。
覆盖 equals
以便它 returns true
如果另一个对象是 A
并且它们具有相同的 ele
。然后你会看到 val2
将返回给两个 get
调用。
每次使用 new
关键字时,它都会在 heap
内存中创建一个新的 object
。所以,a1
和 a2
实际上都是不同的对象。
有关 new
关键字 What New keyword do Internally in Java
您需要实施 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;
}
}
这将使您return只需要一个值。