Java之hashCode的作用和equals方法的重构规则
这个是博主对hashcode的初步理解,以后加深了会再来更新:
1、hashcode是什么?
hashcode是对象的散列码,不同的对象几乎不一样,说几乎是因为还是可以一样的。
特点:每一个对象都有hashcode,默认的值是每一个对象的地址。
2、hashcode的作用:
博主已知的方便用户使用散列表插入数据,我们知道,集合有两种,list----可重复,set----不可重复。
其中set实现不可重复就需要使用到hashcode和equals方法。
散列表set是使用链表数组实现的,每一个列表被称作桶,而查找表中对象的位置使用的方法是:
1)、计算对象的散列码hashcode;
2)、公式:hashcode%桶数=索引;eg:某一个对象的散列码是76268,有128个桶,那么对应的这个对象的位置就是在第108个桶中。
而在插入对象到散列表中的时候使用的是同样的过程,只是这个时候可能会发现原有的位置被占用了,桶已经满了,这个时候就需要equals方法进行判断是否相等。
所以:
在重构equals方法的时候一定要重构hashcode方法,不然使用散列表的时候桶都找不到,更不用说下一步的判断是否是同一个对象了。
下面是示例代码:
public static void main(String[] args) {
String hello = "hello";
StringBuilder helloSB = new StringBuilder(hello);
String hello2 = "hello";
StringBuilder hello2SB = new StringBuilder(hello2);
System.out.println("hello's hashcode:" + hello.hashCode());
System.out.println("helloSB's hashcode:" + helloSB.hashCode());
System.out.println("hello2's hashcode:" + hello2.hashCode());
System.out.println("hello2SB's hashcode:" + hello2SB.hashCode());
Set stringSet = new HashSet();
Set sbSet = new HashSet();
stringSet.add(hello);
System.out.println("======" + stringSet.contains(hello2));
stringSet.add(hello2);
sbSet.add(helloSB);
sbSet.add(hello2SB);
Person person1 = new Person(1, "eke");
Person person2 = new Person(1, "eke");
Set personSet = new HashSet();
personSet.add(person1);
personSet.add(person2);
PersonWithHashCode code1 = new PersonWithHashCode(1, "eke");
PersonWithHashCode code2 = new PersonWithHashCode(1, "eke");
Set codeSet = new HashSet();
codeSet.add(code1);
codeSet.add(code2);
System.out.println(stringSet.size());
System.out.println(sbSet.size());
System.out.println(personSet.size());
System.out.println(codeSet.size());
}
运行结果:
hello's hashcode:99162322
helloSB's hashcode:39219479
hello2's hashcode:99162322
hello2SB's hashcode:2031787571
======true
1
2
2
1
下面是PersonWithHashCode,Person和PersonWithHashCode相比只是缺少了hashCode方法。
贴这个代码还有一点是重构了equals方法,这个方法的重构是要遵循一定规则的(图片来自《java核心技术卷II》):

public class PersonWithHashCode {
private int id;
private String name;
public PersonWithHashCode(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return id * 24 + name.hashCode();
}
@Override
public boolean equals(Object object) {
if (object == this)
return true;
if (object == null)
return false;
if (getClass() != object.getClass())
return false;
PersonWithHashCode person = (PersonWithHashCode) object;
return this.id == person.id
&& Person.StringUtils.compare(name, person.getName());
}
static class StringUtils {
static boolean compare(String a, String b) {
if (a == null && b == null)
return true;
if (a == null && b != null) {
return false;
}
if (a != null && b == null)
return false;
return a.equals(b);
}
}
}
Java之hashCode的作用和equals方法的重构规则的更多相关文章
- Java中hashCode的作用
转 http://blog.csdn.net/fenglibing/article/details/8905007 Java中hashCode的作用 2013-05-09 13:54 64351人阅 ...
- Effective Java 第三版——10. 重写equals方法时遵守通用约定
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
- Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- [复习]java中hashCode的作用
1.HashCode的官方文档定义 (1)hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如java.util.HashTable提供的哈希表. (2)hashCode的 ...
- 【转】Java中hashCode的作用
以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode ...
- java开发----自定义对象,重写equals方法
javaweb开发中,用到了好多自定义对象,这时候如果不重写equals方法,很多时候都会返回false, 因此我们必须习惯重写这个方法. 重点: 1.equals比较俩对象时比较的是对象引用是否指向 ...
- Java中编写一个完美的equals方法
首先看下Java语言规范对equals方法的要求: 1,自反性,对于任何非控引用x,x.equals(x)都应该返回true. 2,对称性,对于任何引用x和y,如果x.equals(y)返回true, ...
- Java面试题:==运算符与equals方法的区别
据说这个面试题目,80%的程序员都会理直气壮的回答错误!! 一: ==运算符 如果比较的是基本数据类型,则直接比较数值是否相等,返回值为"true or false" 如果比较的是 ...
随机推荐
- C语言通讯录系统——C语言单向链表实现
实现的通讯录功能有:查看通讯录.添加联系人.删除联系人.查询联系人.保存并退出. 通过txt文件保存和读取通讯录数据. #include <stdio.h> #include <st ...
- day 24-1 继承
继承 什么是继承: 继承是一种创建新类的方式,在 python 中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 父类必须在子类上面 一个类 可以被多个类继承 一个 ...
- day 21 - 1 包,异常处理
创建目录代码 1. 无论是 import 形式还是 from...import 形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法2. 包是目录级的(文 ...
- vue.js基础
1,感谢菜鸟教程 2,第一个实例 <html> <head> <meta charset="utf-8"> <title>Vue 测 ...
- VS Code保存使用项目Eslint规则格式化代码
One.文件-首选项-设置-选择项目 Two.打开右上角JSON设置 Three. 插入以下代码 { "eslint.options& ...
- PyCharm的使用教程
1.1 安装 首先去下载最新的pycharm ,进行安装.可以直接在官网下载. 1.2 首次使用 1,点击Create New Project. 2, 输入项目名.路径.选择python解释器.如果没 ...
- git查日志命令
git常用命令 1.创建仓库 a.当前目录创建仓库,即把当前目录的文件开始用git管理,该命令会在当前目录下创建一个.git目录 git init b.指定目录创建仓库 git init 目录名 2. ...
- VS code 代码高亮
因为平时经常切换笔记本.家里台式机.工作台式机用 VS code,遂发现笔记本中的 javascript 不像台式机中对象和方法语法高亮,只有简单的关键词高亮.后来找到原因系主题设置.[文件]-[首选 ...
- Android 插件化和热修复知识梳理
概述 在Android开发中,插件化和热修复的话题越来越多的被大家提及,同时随着技术的迭代,各种框架的发展更新,插件化和热修复的框架似乎已经日趋成熟,许多开发者也把这两项技术运用到实际开发协作和正式的 ...
- java - day005 - 数组工具类, 数组复制,二维数组,变量,方法, 面向对象
1. java.util.Arrays 数组工具类 Arrays.toString (数组) 数组值链接字符串 Arrays.sort(数组) 基本类型: 优化的快速排序 引用类型: 优化的合 ...