Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.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 hashset中的方法重写_Java - Fatal编程技术网

Java hashset中的方法重写

Java hashset中的方法重写,java,Java,我开发了一个可以使用hashset概念的应用程序。我必须重写hashset中的equals()、hashCode()和toString()方法。我不知道为什么要覆盖给定的方法。请告诉我在不覆盖上述方法的情况下会发生什么。怎么样 public class MyHashSet<E> extends HashSet<E> { @Override public int hashCode() { ... } @Override public String toStr

我开发了一个可以使用hashset概念的应用程序。我必须重写hashset中的equals()、hashCode()和toString()方法。我不知道为什么要覆盖给定的方法。请告诉我在不覆盖上述方法的情况下会发生什么。

怎么样

public class MyHashSet<E> extends HashSet<E> {
    @Override public int hashCode() { ... }
    @Override public String toString() { ... }
    @Override public boolean equals(Object o) { ... }
}
公共类MyHashSet扩展了HashSet{
@重写公共int hashCode(){…}
@重写公共字符串toString(){…}
@重写公共布尔等于(对象o){…}
}
同样的方法也适用于要存储在哈希集中的对象

public class MyObject {
    @Override public int hashCode() { ... }
    @Override public String toString() { return "MyObject"; }
    @Override public boolean equals(Object o) { return this.equals(o); }
}

// Sample usage
HashSet<MyObject> set = ...
set.add(new MyObject());
公共类MyObject{
@重写公共int hashCode(){…}
@重写公共字符串toString(){返回“MyObject”;}
@重写公共布尔等于(对象o){返回this.equals(o);}
}
//样本使用
HashSet=。。。
set.add(新的MyObject());
例如,请阅读以下内容:

其他地方对这个主题有很多讨论(我推荐有效的Java书籍)

您不需要重写toString(),这是一个额外的功能


基本上,如果不重写equals,就无法按预期的方式从集合中获取内容。例如,如果您的字符串类没有以有意义的方式实现equals,则collection.get(“abc”)和collection.get(new String(“abc”))将给出不同的结果。

假设您希望覆盖将在
哈希集
中使用的对象,而不是
哈希集
本身中的方法,这样做的原因是,将对象放入
HashSet
将获得预期的结果
hashCode()
对于
HashSet
的正常运行尤其重要,正如
equals()
一样。重写
toString()
的主要原因是,您将得到一些对该对象有意义的表示,而不是该方法的默认
object
版本

本质上,如果不重写这些方法,
HashSet
将无法实现您所期望的。例如,假设我有一个类
Foo
,其中我没有重写方法

public class Foo {
    private int number;

    public Foo(int newNumber) {
       number = newNumber;
    }

    public int getNumber() {
        return number;
    }
}
我创建了两个在所有方面都相等的对象
Foo1
Foo2
,但我没有重写
equals()
hashCode()

java不会认为这些是相等的,即使我可以看到它们是相等的,因为我没有解释如何通过重写<代码>等式>()/>代码来比较它们。如果打印hashCode()的值,我将看到分配给不同对象的不同整数值,如下所示:

foo1 = 1671711
foo2 = 11394033
因此,如果我将它们添加到
HashSet
,它会很高兴地将两个对象都放在那里,而我实际上只希望其中一个放在那里


就使用这些方法的面试问题而言,是否也有类似的问题。

您确定您所说的不是覆盖hashCode和equals,不管您在集合中放入何种类型的元素?老实说,你的问题目前太模糊,无法回答。你在问我们,如果你不重写某些方法,会有什么不同——但没有说你的重写行为是什么!请阅读我认为乔恩是对的,你在这个阶段很困惑,没有真正提出一个明确的问题。关于这方面的一个很好的资源是Josh Bloch的高效Java。第3章在这里是相关的,实际上可以在网上找到@马克·彼得斯·乔恩是对的?真正地我对此表示怀疑!
foo1 = 1671711
foo2 = 11394033