Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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:将重复对象添加到集合中?_Java_Hash_Hashcode_Hashset - Fatal编程技术网

Java:将重复对象添加到集合中?

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 {

如果我运行下面的代码,那么输出是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 {
        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;
}