文档章节

重写Set equals()方法时一定要重写hashCode()方法

逐梦whynot
 逐梦whynot
发布于 2015/06/07 22:23
字数 624
阅读 72
收藏 1

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表数据结构中有详细解释

© 著作权归作者所有

共有 人打赏支持
逐梦whynot
粉丝 3
博文 4
码字总数 2584
作品 0
荣昌
我理解的== 、equals 、hashcode

先来回顾一下 == 与equals 的区别 ==是运算符 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean ,他们之间的比较,应该用...

CTO搬砖达人
06/26
0
0
hashcode()和equals()的是是非非

我们在很多博客的文章当中,我们都看到这样一句话:在重写equals方法的同时一定要重写hashCode方法。这是为什么?很多人会说,我的业务代码,只用equals比较比较两个对象是否相等不就可以了,...

似是而非Sage
2016/08/18
23
0
equals与hashcode

equals()和HashCode()深入理解以及Hash算法原理 1.深入理解equals(): 在我的一篇博客“==”和.equals()的区别中向读者提出提醒: Object类中的equals方法和“==”是一样的,没有区别,即俩个...

极微
08/14
0
0
equals和hashCode的区别和联系

一、前言 前段时间使用list.remove(obj)的时候重写了obj的equals方法,因为list的remove是以equals来判断标准的。但是,今天被公司的代码扫描工具提示未重写hashCode方法!!之前准备面试时也...

叫我宫城大人
2017/08/23
0
0
hashcode和equals

若两个对象equals相等(重写了equals方法),但不在一个区间(没有重写hashcode方法),因为hashCode的值在重写之前是对内存地址计算得出,所以根本没有机会进行比较,会被认为是不同的对象。所...

WJobs
06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis常用命令

keys 我把这个命令放在第一位,是因为笔者曾经做过的项目,以及一些朋友的项目,都因为使用keys这个命令,导致出现性能毛刺。这个命令的时间复杂度是O(N),而且redis又是单线程执行,在执行k...

谢思华
20分钟前
1
0
关于css宽度分离

所谓宽度分离就是width 属性不与影响宽度的 padding/border(有时候包括 margin)属性共存 例如: .box{width:200px;padding:20px;border:1px solid;} 为何要做宽度分离 一说到分离就是为了好...

莫西摩西
31分钟前
0
0
Linux常用命令

###############常用命令说明############################## cat /proc/version 显示内核的版本 mv dir1 new_dir 重命名/移动 一个目录 rm -rf a.txt b.txt c.txt 删除多个文件 chmod 777 ......

lyle_luo
38分钟前
1
0
全国地区代码科普

全国地区代码表 天津市 地区代码 地区名称 1100 天津市 辽宁省 地区代码 地区名称 2210 沈阳市 2210 法库县 2210 康平县 2210 辽中县 2210 新民市 2220 大连市 2222 普兰店市 2223 庄河市 22...

恋码之子
38分钟前
0
0
DbForge Schema Compare for MySQL入门教程:生成比较报告

【dbForge Schema Compare for MySQL下载】 当架构比较完成后,您可以生成比较报告以保留架构更改的记录。 1. 在“Comparison” 菜单中,单击“Generate Comparison Report” 。将打开“Gen...

Miss_Hello_World
39分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部