【问题标题】:inserting into set class in java [duplicate]在java中插入set类[重复]
【发布时间】:2018-11-26 21:19:33
【问题描述】:
import java.util.*;
class emp{
    String city;
    String name;
    emp(String a, String b)
    {
        city=a;
        name=b;
    }
}
public class HelloWorld{

     public static void main(String []args){
         Set<emp> s = new HashSet<emp>();
         emp s1=new emp("bangalore","mukesh");
         emp s2= new emp("bangalore","mukesh");
         s.add(s1);
         s.add(s2);
         System.out.println(s1.equals(s2));
         System.out.println("finsih");
         System.out.println(s);

     }
}

我正在创建两个相同的对象,但它们被输入到集合中,为什么 s1.equals(s2) 返回 false?

【问题讨论】:

  • 如果你想让这两个对象相等,你需要重写对象类的equals函数来编写你自己的equals函数。
  • 如果您的意图是该集合只有一个emp 对象(因为您认为它们相等),那么您需要同时实现equals()hashCode()。见Understanding the workings of equals and hashCode in a HashMap
  • 仅供参考: Java 命名约定是类名以大写字母开头,即Emp。此外,将参数命名为ab 对调用该方法的人没有多大帮助。

标签: java collections


【解决方案1】:

它与插入设置无关。你需要重写equals,例如下面是基本的equals方法:

@Override
public boolean equals(Object o) {

    if (o == this) return true;
    if (!(o instanceof Emp)) {
        return false;
    }
    Emp emp = (Emp) o;
    return  Objects.equals(city, emp.city) &&
            Objects.equals(name, emp.name);
}

Follow details ,按照这里的示例: https://www.mkyong.com/java/java-how-to-overrides-equals-and-hashcode/

【讨论】:

    【解决方案2】:

    由于您没有覆盖equals(),因此使用Object#equals,默认情况下使用== 运算符。由于您使用 new 运算符创建了 2 个对象,因此它们的引用不同,因此对 equals() 的调用返回 false。您可以同时覆盖 equalshashcode 以提供相等性:

    class emp{
        String city;
        String name;
        emp(String a, String b) {
            city=a;
            name=b;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof emp)) return false;
            emp test = (emp) o; 
            return Objects.equals(city, emp.city) &&
                    Objects.equals(name, emp.name);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(city, name);
    
    }
    

    现在尝试存储对象只会在集合中存储一个对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2015-12-19
      • 2023-03-24
      相关资源
      最近更新 更多