Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-重写hashCode和toString_Java_Dictionary_Hashmap_Equals_Tostring - Fatal编程技术网

Java-重写hashCode和toString

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; }

当两个对象在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);
    }
}
但如果我将a1和a2的值放在一个映射中,我希望map.geta1和map.geta2都返回val1或val2 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;
    }
}