文档章节

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

逐梦whynot
 逐梦whynot
发布于 2015/06/07 22:23
字数 624
阅读 64
收藏 1
点赞 0
评论 0

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搬砖达人 ⋅ 2017/03/10 ⋅ 0

hashcode()和equals()的是是非非

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

似是而非Sage ⋅ 2016/08/18 ⋅ 0

equals和hashCode的区别和联系

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

叫我宫城大人 ⋅ 2017/08/23 ⋅ 0

hashcode和equals

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

WJobs ⋅ 06/15 ⋅ 0

java中hashCode和equals的使用

Java.lang.Object 有一个hashCode()和一个equals()方法,这两个方法在软件设计中扮演着举足轻重的角色。在一些类中重写这两个方法以完成某些重要功能。 为什么要用 hashCode()? 集合Set中的元...

神秘的寇先森 ⋅ 2017/12/26 ⋅ 1

why在重写equals时还必须重写hashcode方法

首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anObject) { if (this == anObject) { return tr...

Vincent-Duan ⋅ 2016/10/29 ⋅ 0

关于重写equals和hashCode

什么时候需要重写equals和hashCode方法 在比较两个对象的内容的时候,需要重写这两个方法。java系统本身提供的(==)比较方法,有两种情况: 1.比较的是基本类型数据,则此时== 跟equals的效...

肖安安 ⋅ 2017/05/25 ⋅ 0

细说equals()方法和hashCode()方法

一、前言 对于这两个方法的研究,源于一道比较经典的面试题:“x.equals(y)==true;x,y可有不同的hashcode对吗?”,其实这道题的关键在于考我们对equals()方法和hashCode()方法的理解,网上看...

EnjoyAndroid ⋅ 2017/11/24 ⋅ 0

Java实战equals()与hashCode()

一.equals()方法详解 equals()方法在object类中定义如下:   代码 public boolean equals(Object obj) { return (this == obj); }   很明显是对两个对象的地址值进行的比较(即比较引用是...

凯哥学堂 ⋅ 2016/12/01 ⋅ 0

细说equals()方法和hashCode()方法

一、前言 对于这两个方法的研究,源于一道比较经典的面试题:“x.equals(y)==true;x,y可有不同的hashcode对吗?”,其实这道题的关键在于考我们对equals()方法和hashCode()方法的理解,网上看...

EnjoyAndroid ⋅ 2017/11/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 20分钟前 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 21分钟前 ⋅ 0

Redux的一些手法记录

Redux Redux的基本概念见另一篇文。 这里记录一下Redux在项目中的实际操作的手法。 actions 首先定义action.js,actions的type,可以另起一个action-type.js文件。 action-type.js用来存...

LinearLaw ⋅ 22分钟前 ⋅ 0

android 手势检测(左右滑动、上下滑动)

GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等。 使用GestureDetector分三步: 1. 定义GestureDetector类 2. 初始化手势类,同时设置手势监听 3. 将touch事件交给gesture...

王先森oO ⋅ 37分钟前 ⋅ 0

java 方法的执行时间监控 设置超时(Future 接口)

java 方法的执行时间监控 设置超时(Future 接口) import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor......

青峰Jun19er ⋅ 41分钟前 ⋅ 0

一名开源小白的Apache成长自述

今天收到了来自Apache Vote我成为Serviceomb项目Committer的邮件,代表自己的贡献得到了充分的肯定;除了感谢团队的给力支持,我更希望将自己的成长经历——如何践行Apache Way的心得介绍给大...

微服务框架 ⋅ 43分钟前 ⋅ 0

vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴

1.vim 是 vi 的升级版 vim 是带有颜色显示的 mini安装的系统,一般都不带有vim [root@aminglinux-128 ~]# yum install -y vim-enhanced已加载插件:fastestmirror, langpacksLoading mir...

oschina130111 ⋅ 44分钟前 ⋅ 0

Deepin 操作系统四面楚歌

作为国内做的最好的 Linux 发行版,源自 Debian sid 的 Deepin 目前正面临重重困境,新版本不断延期,开发人员离职,bug 长期得不到修复,和 Debian/Ubuntu 的兼容性问题也面临越来越严重的挑...

六库科技 ⋅ 44分钟前 ⋅ 0

MyBatis之动态sql

我们需要知道的是,使用mybatis重点是对sql的灵活解析和处理。在原先的UserMappser.xml中,我们这样查询表中满足条件的记录 : 123 <select id="findUserList" parameterType="userQuery...

瑟青豆 ⋅ 44分钟前 ⋅ 0

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已...

开源中国众包平台 ⋅ 45分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部