重写Set equals()方法时一定要重写hashCode()方法
重写Set equals()方法时一定要重写hashCode()方法
逐梦whynot 发表于3年前
重写Set equals()方法时一定要重写hashCode()方法
  • 发表于 3年前
  • 阅读 61
  • 收藏 1
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 最近实训,要实现将一个自定义的若干对象放入Set集合中,并遍历出来,要求不能有重复元素。心想这还不简单,Set集合本身就不能添加重复元素,可是,想错了

package com.cx.shape;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Employee {
 private int age;//年龄
 private String name;//姓名
 private double salary;//薪水
 
 public Employee (int age,String name ,double salary){
  this.age = age;
  this.name = name;
  this.salary = salary;
 }
 public int getAge() {
  return age;
 }
 public String getName() {
  return name;
 }
 public double getSalary() {
  return salary;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public void setName(String name) {
  this.name = name;
 }
 public void setSalary(double salary) {
  this.salary = salary;
 }
 
 public int  compareTo(Object o){
  Employee e = (Employee) o;
  if(this.salary!=e.salary){
   return (int) (this.salary - e.salary);
  }
  if(this.age!=e.age){
   return this.age = e.age;
  }
  return this.name.compareTo(e.name);
 }
 @Override
 public int hashCode() {
  return name.hashCode();
 }
 /**
  * 重写equals()方法
  */
 @Override 
    public boolean equals(Object obj) { 
        if(obj == null) return false; 
        if(this == obj) return true; 
        /*if(obj instanceof Employee) 
           return true;  */
        if(obj.getClass()==Employee.class){
         Employee emp = (Employee)obj;
         return emp.name.equals(name);
        }
        return false; 
    }
 public static void main(String[] args) {
  Set<Employee> emps = new HashSet<Employee>();
  emps.add(new Employee(20,"张三",5900.2));
  emps.add(new Employee(22,"张三",3499.0));
  emps.add(new Employee(21,"wawa",5699.4));
  //遍历集合
  for(Iterator<Employee> emp = emps.iterator();emp.hasNext();){
   System.out.println("姓名为"+emp.next().name);
  }
  
 }
}

注意:1、当向集合Set中增加对象时,首先集合计算要增加对象的hashCode码,根据该值来得到一个位置用来存放当前对象,在该位置没有一个对象存在的话,那么集合Set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,在进行一次散列,将该对象放到散列后计算出的新地址里,如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。
    2、重写equals方法的时候必须重写hashCode方法。如果一个类的两个对象,使用equals方法比较时,结果为true,那么该两个对象具有相同的hashCode。原因是equals方法为true,表明是同一个对象,它们的hashCode当然相同。 当不重写的时候就会有重复元素。
    3、Ojbect类的hashCode方法返回的是Object对象的内存地址。我们可以通过Integer.toHexString(new Object().hashCode);来得到。

  4、对于hash表数据结构中有详细解释

共有 人打赏支持
粉丝 3
博文 4
码字总数 2584
×
逐梦whynot
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: