Java-重写hashCode和toString
当两个对象在A类中具有相同的ele值时,则这两个对象相等。因此,我重写了toString和hashCode,以返回对象的ele,而不考虑s的值Java-重写hashCode和toString,java,dictionary,hashmap,equals,tostring,Java,Dictionary,Hashmap,Equals,Tostring,当两个对象在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 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);
}
}
但如果我将a1和a2的值放在一个映射中,我希望map.geta1和map.geta2都返回val1或val2当然,A1和A2有相同的哈希代码,但是它们没有被认为是相等的,因为你没有重写相等,考虑两个具有相同ELE相等的对象。在使用哈希代码后,映射将使用等于等式上的最终标尺。地图会将两个对象放在同一个桶中,但由于它们不相等,它会同时保留这两个对象
Override equals,以便在另一个对象是A且它们都具有相同的ele时返回true。然后,你会看到VAL2会为两个get调用返回。< P>当然,A1和A2有相同的哈希代码,但是它们不被认为是相等的,因为你没有重写相等来考虑两个具有相同ELE相等的对象。在使用哈希代码后,映射将使用等于等式上的最终标尺。地图会将两个对象放在同一个桶中,但由于它们不相等,它会同时保留这两个对象
Override equals,以便在另一个对象是A且它们都具有相同的ele时返回true。然后您将看到两个get调用都将返回val2。每次使用new关键字时,它都会在堆内存中创建一个新对象。因此,a1和a2实际上都是不同的对象
有关新关键字的更多信息,请参阅此文档。每次使用新关键字时,它都会在堆内存中创建一个新对象。因此,a1和a2实际上都是不同的对象
有关新关键字的更多信息,请参阅此部分,您需要实现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;
}
}
这将使您只返回所需的一个值。您需要实现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;
}
}
这将使您只返回所需的一个值。Oh ya。。我的错。我认为它使用toString来获取字符串表示,然后进行比较,但我猜它在链接时使用列表。但我先进入val1。但我两个都得到了2分。为什么?当你把a2放到地图上时,地图认为它等于a1,因为equals返回true。然后,映射将键值对替换为存在的条目,a1->val1,并将其替换为a2->val2。两个get调用都会导致equals返回true,因此每次都会检索当前值val2。历史上,HashMap始终使用散列到同一个bucket的节点的链接列表。从Java8开始,当bucket中的条目数达到阈值时,HashMap会切换到树映射式结构。我的Java8源代码表明,该阈值当前为8。。我的错。我认为它使用toString来获取字符串表示,然后进行比较,但我猜它在链接时使用列表。但我先进入val1。但我两个都得到了2分。为什么?当你把a2放到地图上时,地图认为它等于a1,因为equals返回true。然后,映射将键值对替换为存在的条目,a1->val1,并将其替换为a2->val2。两个get调用都会导致equals返回true,因此每次都会检索当前值val2。历史上,HashMap始终使用散列到同一个bucket的节点的链接列表。从Java8开始,当bucket中的条目数达到阈值时,HashMap会切换到树映射式结构。我的Java8源代码表明该阈值当前为8。
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;
}
}