这个是博主对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方法的重构规则的更多相关文章

  1. Java中hashCode的作用

    转  http://blog.csdn.net/fenglibing/article/details/8905007 Java中hashCode的作用 2013-05-09 13:54 64351人阅 ...

  2. Effective Java 第三版——10. 重写equals方法时遵守通用约定

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

  3. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

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

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

  5. [复习]java中hashCode的作用

    1.HashCode的官方文档定义 (1)hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如java.util.HashTable提供的哈希表. (2)hashCode的 ...

  6. 【转】Java中hashCode的作用

    以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表. hashCode  ...

  7. java开发----自定义对象,重写equals方法

    javaweb开发中,用到了好多自定义对象,这时候如果不重写equals方法,很多时候都会返回false, 因此我们必须习惯重写这个方法. 重点: 1.equals比较俩对象时比较的是对象引用是否指向 ...

  8. Java中编写一个完美的equals方法

    首先看下Java语言规范对equals方法的要求: 1,自反性,对于任何非控引用x,x.equals(x)都应该返回true. 2,对称性,对于任何引用x和y,如果x.equals(y)返回true, ...

  9. Java面试题:==运算符与equals方法的区别

    据说这个面试题目,80%的程序员都会理直气壮的回答错误!! 一: ==运算符 如果比较的是基本数据类型,则直接比较数值是否相等,返回值为"true or false" 如果比较的是 ...

随机推荐

  1. delphi 获取时间戳 如何得到 和 js 中 new Date().getTime();的 相同?

    new Date().getTime();  //1533213439019 通过,启发 function DateTimeToUnix(const AValue: TDateTime): Int64 ...

  2. C# 读取 Excel 最全最稳定的方式

    采用 NPOI 和 Epplus 方式读取Excel,因为之前测试NPOI的时候发现对于 .xlsx 格式的文件读取不是很友好,所以才结合了两个. 废话少说,直接上代码: public static ...

  3. c++ 入门 之 hello world 和基本语法

    1,linux系统上如何跑c++程序 1,vim一个hello.cpp,内容如下: #include <iostream> using namespace std; int main() ...

  4. HDU - 1050

    wa了5遍?!! (1)前4遍,思路没简化,企图模拟整个过程,但是调用sort函数时由于没有把奇数的屋子和偶数的屋子统一,排序出了问题. 思路:遍历n段,每次只扫未被标记过的一段,ans++并且从该段 ...

  5. Java基础 -- 连接字符串时,使用+还是StringBuilder

    结论 1-源代码中使用的+连接,实际上都使用的是StringBuilder. 2-用jad工具反编译,好处之一就是可以同时生成字节码和源代码.这样可以进行对照研究. ----------------- ...

  6. zkw线段树学习笔记

    zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...

  7. SpringSecurity在Springboot下使用的初步体验

    SpringSecurity曾经在十年前非常火热,只要是做权限系统,当时几乎非用它不可,记得是在XML文件里一堆的配置.曾几何时,Shiro冒了出来,以其简洁和轻量的风格慢慢地捕获了众多码农的心,从此 ...

  8. centos7 把终端显示改为英文/中文

    把终端显示改为英文: 1.先备份语言配置文件 cp /etc/locale.conf /home/locale.conf.backup 2.打开配置文件 vim /etc/locale.conf 3. ...

  9. char *p[] 和char**的思考

    char *p[] = {"hello","world"}; char **pp; pp = p; printf("%s,%s\n",*pp ...

  10. margin合并和浮动

    1.父子元素margin塌陷问题子元素设置margin-top作用于父元素时, 会产生margin合并问题. 解决方法是: 给父元素的::before伪元素设置为display:table属性, 其中 ...