Java 简单HashSet包含误解

Java 简单HashSet包含误解,java,set,hashset,Java,Set,Hashset,对于下一个示例,我不理解为什么HashSet返回false。代码: import java.util.*; public class Name { private String first, last; public Name(String first, String last){ this.first = first; this.last = last; } public boolean equals(Name n){

对于下一个示例,我不理解为什么HashSet返回false。代码:

import java.util.*;

public class Name {
    private String first, last;

    public Name(String first, String last){
        this.first = first; 
        this.last = last;
    }

    public boolean equals(Name n){
        return n.first.equals(first) && n.last.equals(last);
    }

    public int hashCode(){
        return 31*first.hashCode()+last.hashCode();
    }

    public static void main(String[] args){
        Set<Name> s = new HashSet<Name>();
        Name n1 = new Name("Donald", "Duck");
        Name n2 = new Name("Donald", "Duck");
        s.add(n1);

        System.out.print("HashCodes equal: ");
        System.out.println( n1.hashCode() == n2.hashCode());
        System.out.print("Objects equal: ");
        System.out.println( n1.equals(n2) );

        System.out.print("HashSet contains n1: ");
        System.out.println(s.contains(n1));

        System.out.print("HashSet contains n2: ");
        System.out.println(s.contains(n2));
    }

}
摘录自包含方法说明:

如果此集合包含指定的元素,则返回true。更多 形式上,当且仅当该集合包含元素e时,返回true 这样o==null?e==null:o.equalse


问题:为什么即使两个对象都不为null并且它们在hesh和value方面都相等,它也会为这两个对象返回false?

,因为您没有重写从Object类继承的equals方法

输出演示:


因为您没有重写从对象类继承的equals方法

输出演示:


重写对象的equals方法时出错

    public boolean equals(Name n){
这只是一种方法。正确的合同是:

    public boolean equals(Object o){
     // .....
    }

重写对象的equals方法时出错

    public boolean equals(Name n){
这只是一种方法。正确的合同是:

    public boolean equals(Object o){
     // .....
    }

是的,好的,使用n1.equalsObject n2很容易检查。谢谢是的,好的,使用n1.equalsObject n2很容易检查。谢谢
    public boolean equals(Object o){
     // .....
    }