为什么要编写hashCode方法

  hashCode在平时不常自己去编写,但是在真正高质量的代码中却是必不可少的。

  看看Java中的Object对hashCode方法的描述:

    1.返回对象的哈希码,是为了提高哈希表的性能,例如java.util.HashTable

    2.同一个对象多次调用hashCode方法时,必须一致的返回相同的整数

    3.若两个对象相等,则调用hashCode方法的时候必须返回相同的整数

不编写hashCode方法出现的情况

  下面有这样的一个实体类:

/**
* @class User
* @introduction 实体类
* @author Ray_xujianguo
*/
public class User {
private String name; //姓名
private int age; //年龄
private long friendNumber; //朋友数目
private float cash; //现金
private double wealth; //财富
private boolean isMarry; //是否已婚 //无参数构造方法
public User() {} //有参数构造方法
public User(String name, int age, long friendNumber, float cash, double wealth, boolean isMarry) {
this.name = name;
this.age = age;
this.friendNumber = friendNumber;
this.cash = cash;
this.wealth = wealth;
this.isMarry = isMarry;
} @Override
public boolean equals(Object object) {
if(object instanceof User) {
User user = (User)object;
if(user.getName().equals(name) &&
user.getAge() == age &&
Long.compare(user.getFriendNumber(), friendNumber) == 0 &&
Float.compare(user.getCash(), cash) == 0 &&
Double.compare(user.getWealth(), wealth) == 0 &&
user.isMarry() == isMarry) {
return true;
} else {
return false;
}
} else {
return false;
}
} //getter and setter method
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public long getFriendNumber() {
return friendNumber;
} public void setFriendNumber(long friendNumber) {
this.friendNumber = friendNumber;
} public float getCash() {
return cash;
} public void setCash(float cash) {
this.cash = cash;
} public double getWealth() {
return wealth;
} public void setWealth(double wealth) {
this.wealth = wealth;
} public boolean isMarry() {
return isMarry;
} public void setMarry(boolean isMarry) {
this.isMarry = isMarry;
}
}

  这个实体类是重写了equals方法的,现在我们试图将其放进Map中,再将其拿出来。

    @Test
public void testHashCode() {
Map<User, String> map = new HashMap<User, String>();
map.put(new User("xujianguo", 21, (long)1000, (float)12.5, (double)6000.25, false), "admin");
System.out.println(map.get(new User("xujianguo", 21, (long)1000, (float)12.5, (double)6000.25, false)));
}

  这个的map存进去了一个User和String啊,根据这个User怎么拿不到呢,原因是因为这两个User的hashCode不一样,说到根本的东西就是调用hashCode方法没有返回一致的哈希码下面我们就来说说怎么编写hashCode方法。

编写hashCode方法

  1.把某个非零的常数值,保存在一个名为result的int类型的常量中

  2.属性域f哈希码c的计算

  • 如果是boolean类型,true为1,false为0
  • 如果是byte、char、short和int类型,强制为int的值
  • 如果是long类型,计算(int)(f^(f>>32))
  • 如果是float类型,计算Float.floatToIntBits(f)
  • 如果是double类型,计算Double.doubleToLongBits(f),再按照long的方法进行计算
  • 如果是引用类型,则调用其hashCode方法(假设其hashCode满足你的需求)

  3.代入公式result = result * 31 + c

  4.返回result

  现在针对这User类来编写hashCode方法:

    @Override
public int hashCode() {
int result = 17;
result = 37 * result + name.hashCode();
result = 37 * result + age;
result = 37 * result + (int)(friendNumber^(friendNumber>>32));
result = 37 * result + Float.floatToIntBits(cash);
result = 37 * result + (int)(Double.doubleToLongBits(wealth)^(Double.doubleToLongBits(wealth)>>32));
result = 37 * result + (isMarry ? 1 : 0);
return result;
}

  加入了这个hashCode方法后,上面那个testHashCode方法就可以成功通过key拿出value了。

编写简单的hashCode方法的更多相关文章

  1. 如何编写出高质量的 equals 和 hashcode 方法?

    什么是 equals 和 hashcode 方法? 这要从 Object 类开始说起,我们知道 Object 类是 Java 的超类,每个类都直接或者间接的继承了 Object 类,在 Object ...

  2. Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  3. 重新编写equals()方法,hashCode()方法,以及toString(),提供自定义的相等标准,以及自描述方法

    下面给出一个实例,重新编写equals()方法,提供自定义的相等标准 public class PersonTest { public static void main(String[] args) ...

  4. 重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源

    今天这篇文章我们打算来深度解读一下equal方法以及其关联方法hashCode(),我们准备从以下几点入手分析: 1.equals()的所属以及内部原理(即Object中equals方法的实现原理) ...

  5. 浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  6. 为什么重写equals时必须重写hashCode方法?

    原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html 首先我们先来看下String类的源码:可以发现Stri ...

  7. Java中的equals和hashCode方法

    本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...

  8. java的HashCode方法

    总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复: 后者元素无序,但元素不可重复. 要想保证元素不重复,可两个元素是 ...

  9. java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

随机推荐

  1. Oracle 修改字符集

    出现ORA-12899,是字符集引起的,中文在UTF-8中占3个字节,ZHS16GBK中占2个字节,而源dmp文件字符集是ZHS16GBK库里倒出来的数据,现在要导入到目标字符集为UTF-8的库里,所 ...

  2. js中document.write()使用方法

    <script>             var hrf = window.location.href;           if(hrf.indexOf('change')>0){ ...

  3. hdu 3068 最长回文(manachar模板)

    Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等   Input 输 ...

  4. ftp server来源分析20140602

    ftp  server学习位和源代码分析片 记录自己的第一个开源的分析过程: 从源代码:野狐灯(我接下来的几篇文章是从源头:野狐灯,每个以下哪项不是他们设置.) 20140602 Ftp的源码目录例如 ...

  5. unity脚本运行顺序具体的解释

    unity脚本自带函数执行顺序例如以下:将以下脚本挂在随意物体执行就可以得到 Awake ->OnEable-> Start ->-> FixedUpdate-> Upd ...

  6. 从头学起android&lt;GridView网格视图.二十八.&gt;

    GridView基于组件的网络格所有的形式的组分的,例如:当制作专辑,所有的图片将在相同的尺寸在不同的显示格在孩子,是否能够依靠这个组件完成.此组件的继承结构参见例如下面: java.lang.Obj ...

  7. jsmart 前结合案例

    前绑定jsmart这是一个不错的选择.之前通过经常使用的项目中的.最近涉及的领域的后端部.jsmart有些使用相对较少,主要是因为他想引用文件,我写的模板,在一个简单的项目,直接使用js界,很复杂的前 ...

  8. Configuration配置信息管理

    Configuration配置信息管理 在前面的章节中,我们知道新版的MVC程序抛弃了原来的web.config文件机制,取而代替的是config.json,今天我们就来深入研究一下配置文件的相关内容 ...

  9. ASP.NET——RequiredFieldValidator控制和ValidationSummary控制

    我们的登录页面,忘记承担损失password然后username,该页面将永远是一个小提醒. 那么我们在网也制作的时候怎样实现这一功能呢?这就用到了RequiredFieldValidator控件和V ...

  10. Atitit.软件GUIbutton与仪表盘--db数据库区--导入mysql sql错误的解决之道

    Atitit.软件GUIbutton与仪表盘--db数据库区--导入mysql sql错误的解决之道 Keyword::截取文本文件后部分 查看提示max_allowed_packet限制 Targe ...