Java:将重复对象添加到集合中?
如果我运行下面的代码,那么输出是2,这意味着集合包含2个元素。但是,我认为该集合应该包含1,因为基于hashcode()值以及Java:将重复对象添加到集合中?,java,hash,hashcode,hashset,Java,Hash,Hashcode,Hashset,如果我运行下面的代码,那么输出是2,这意味着集合包含2个元素。但是,我认为该集合应该包含1,因为基于hashcode()值以及.equals()方法,这两个对象是相等的。 我的理解似乎有点明显的错误 package HELLO; import java.util.HashSet; import java.util.Set; public class Test { public static void main(String[] args) throws Exception {
.equals()
方法,这两个对象是相等的。
我的理解似乎有点明显的错误
package HELLO;
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) throws Exception {
Set<Alpha> s = new HashSet<Alpha>();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
s.add(a1);
s.add(a2);
System.out.println(s.size());
}
}
class Alpha {
int a = 10;
public int hashcode() {
return a;
}
public boolean equals(Object obj) {
return (obj instanceof Alpha && ((Alpha) obj).a == this.a);
}
public String toString() {
return "Alpha : " + a;
}
}
包你好;
导入java.util.HashSet;
导入java.util.Set;
公开课考试{
公共静态void main(字符串[]args)引发异常{
Set s=新的HashSet();
Alpha a1=新的Alpha();
αa2=新α();
s、 添加(a1);
s、 添加(a2);
System.out.println(s.size());
}
}
阿尔法类{
INTA=10;
公共int hashcode(){
返回a;
}
公共布尔等于(对象obj){
返回(Alpha&((Alpha)obj.a==this.a)的obj实例;
}
公共字符串toString(){
返回“Alpha:+a;
}
}
您的hashcode方法不会覆盖对象类的hashcode方法,因此您的equals方法会破坏契约,因为它与hashcode结果不一致,并且您可以拥有“相等”但具有不同hashcode的对象
请记住:在重写方法时,应始终使用@Override
注释,因为这将帮助您捕获此错误和类似错误
@Override // ** don't forget this annotation
public int hashCode() { // *** note capitalization of the "C"
return a;
}
此外,您还需要改进代码格式,尤其是在这里发布代码供我们审阅时。我们将能够更好地理解您的代码,并帮助您确定代码是否符合标准(这就是标准存在的原因)。因此,请尽量使缩进与同一块中在同一级别缩进的所有代码行保持一致,并确保基级代码(包括导入、外部类声明及其结尾大括号)左对齐:
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) throws Exception {
Set<Alpha> s = new HashSet<Alpha>();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
s.add(a1);
s.add(a2);
System.out.println(s.size());
}
}
class Alpha {
int a = 10;
@Override
public int hashCode() {
return a;
}
public String toString() {
return "Alpha : " + a;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Alpha other = (Alpha) obj;
if (a != other.a)
return false;
return true;
}
}
import java.util.HashSet;
导入java.util.Set;
公开课考试{
公共静态void main(字符串[]args)引发异常{
Set@Overrides注释用于覆盖超类中具有相同名称的方法”
您的方法hashcode应命名为hashcode(大写字母“C”)
如果计划重写方法,则应使用@Override
注释
如果您使用了该注释,您会更早地注意到问题,因为代码不会编译。谢谢!永远不会忘记使用@Override:)@snow\u leopard:这是一个很好的习惯。祝您好运!除了“@Override”“我还必须在equals函数中添加一行,否则集合无法检测重复项,并且总是多次包含具有相同内容的对象:if(this.hashCode()==msg.hashCode())return true;@sven:事实上,我强烈建议不要使用您的代码行,因为它与equals和hashCode合同规定的完全相反。您需要这行代码表明您的equals方法可能有其他错误。@hoverkraft:您是对的,我在equals()中有一个错误在错误的情况下返回false,因此出现了多个条目。检查equals()中的哈希值不好。
@Override
public int hashCode() {
return a;
}
@Override
public boolean equals(Object obj) {
return (obj instanceof Alpha && ((Alpha) obj).a == this.a);
}
@Override
public String toString() {
return "Alpha : " + a;
}