关于hashcode与equal函数

标签: hashcode equal 函数 | 发表时间:2014-12-29 11:05 | 作者:wenrisheng
出处:http://www.iteye.com

hashcode:独一无二地代表了一个对象,并且通过hashcode可以找到这个对象。(比价不准确的说法)

在java.lang.Object的规范中,对hasCode有如下的约定:
 1 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么对该对象调用多次hashCode方法,它必须返回相同的整数。在同一程序的多次执行过程中,这个整数方法可以不同。
2 如果两个对象根据equals方法是相等的,那么调用这两个对象的hashCode方法必须产生同样的整数结果。
3 如果两个对象根据equals方法是不相等的,那么调用这两个对象的hashCode方法,不要求产生不同的整数结果。

只是为了维护 hashCode 方法的常规协定,才要求用equals比较的两个对象的hashCode相同.

equals()和hashCode()都来自java.lang.Object.你当然可以重写.

比如a.equals(b).仅当a的内存地址相等时,才返回true.当然如String等类已经对这个方法进行了重写,比较的就不再是内存地址了.

hashCode()的值也是与内存地址相关的.所以仅当内存地址相等时,hashCode才相等.同样很多类也重写了这个方法,还是以String为例:
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
就不在与内存地址相关了.这样做是为了保证用equals比较返回为true的两个对象,他们的hashCode是相同的.

所以一般重写equals的时候都会重写hashCode().

当然,这个相当于一个约定,一个协议.你不这么做并不会错.

 

hash code、equals和“==”三者的关系

1.如果是基本变量,没有hashcode和equals方法,基本变量的比较方式就只有==;

2.如果是变量,由于在java中所有变量定义都是一个指向实际存储的一个句柄(你可以理解为c++中的指针),在这里==是比较句柄的地址(你可以理解 为指针的存储地址),而不是句柄指向的实际内存中的内容,如果要比较实际内存中的内容,那就要用equals方法,但是!!!

如果是你自己定义的一个类,比较自定义类用equals和==是一样的,都是比较句柄地址,因为自定义的类是继承于object,而object中的equals就是用==来实现的,你可以看源码。

那为什么我们用的String等等类型equals是比较实际内容呢,是因为String等常用类已经重写了object中的equals方法,让equals来比较实际内容,你也可以看源码。

3. hashcode
在一般的应用中你不需要了解hashcode的用法,但当你用到hashmap,hashset等集合类时要注意下hashcode。

你想通过一个object的key来拿hashmap的value,hashmap的工作方法是,通过你传入的object的hashcode在内存中找 地址,当找到这个地址后再通过equals方法来比较这个地址中的内容是否和你原来放进去的一样,一样就取出value。

所以这里要匹配2部分,hashcode和equals
但假如说你new一个object作为key去拿value是永远得不到结果的,因为每次new一个object,这个object的hashcode是 永远不同的,所以我们要重写hashcode,你可以令你的hashcode是object中的一个恒量,这样永远可以通过你的object的 hashcode来找到key的地址,然后你要重写你的equals方法,使内存中的内容也相等。。。

== 是比较地址是否相等,JAVA中声明变量都是引用嘛,不同的引用,可能指向同一个地址。

equals 是比较值是否相等。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hashcode equal 函数] 推荐:

关于hashcode与equal函数

- - 编程语言 - ITeye博客
hashcode:独一无二地代表了一个对象,并且通过hashcode可以找到这个对象. 在java.lang.Object的规范中,对hasCode有如下的约定:.  1 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么对该对象调用多次hashCode方法,它必须返回相同的整数.

hashCode equal避免的几个误区

- - ITeye博客
对于hashcode方法和equals方法,我们需要注意以下几点:. 1.equals方法所需要的几个特性.    ?什么情况下进行equals的比较. 答案是用equals比较的只是值本身,对于equals方法,读者需要记住按照两种情况来运用,一比较基本类型的值的比较,二比较的是对象. equals比较的只是值或者对象的内容.

重写equal 的同时为什么必须重写hashcode?

- - Java - 编程语言 - ITeye博客
hashCode是编译器为不同对象产生的不同整数,根据equal方法的定义:如果两个对象是相等(equal)的,那么两个对象调用hashCode必须产生相同的整数结果,即:equal为true,hashCode必须为true,equal为false,hashCode也必须为false,所以必须重写hashCode来保证与equal同步.

java中的hashcode作用

- - 编程语言 - ITeye博客
根据API文档,java中的hashcode事实上是跟equals是有着密切联系的,hashcode是为了提高哈希表的性能. public int hashCode()返回该对象的哈希码值. 支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能. 说明是一个本地方法,它的实现是根据本地机器相关的.

为什么要重写equles和hashcode

- - 编程语言 - ITeye博客
  经过网上查阅资料得出如下结论.                      大家知道,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复. 那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢.

hashCode()方法的性能优化

- - 并发编程网 - ifeve.com
原文链接, 译文链接,原文作者: Robert Nystrom,译者:有孚. 本文主要讨论下不同的hashCode()的实现对应用程序的性能影响. hashCode()方法的主要目的就是使得一个对象能够成为hashMap的key或者存储到hashset中. 这种情况下对象还得实现equals(Object)方法,它的实现和hashCode()必须是一致的:.

【转】java中hashcode()和equals()的详解

- - 互联网 - ITeye博客
首先equals()和hashcode()这两个方法都是从object类中继承过来的. equals()方法在object类中定义如下: . 很明显是对两个对象的地址值进行的比较(即比较引用是否相同). 但是我们必需清楚,当String 、Math、还有Integer、Double. 等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

hashcode和equals区别和联系

- - Java - 编程语言 - ITeye博客
[size=x-small]HashCode和equal方法的区别和联系[/size]. HashCode 和 equal方法重载. 1、 为什么要重载equal方法. 答案:因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法.

[转]《Effective Java》中推荐的hashCode算法

- - 荒岛码农
Google首席Java架构师Joshua Bloch在他的著作《Effective Java》中提出了一种简单通用的hashCode算法:. 初始化一个整形变量,为此变量赋予一个非零的常数值,比如int result = 17;. 选取equals方法中用于比较的所有域,然后针对每个域的属性进行计算:.

详解 equals() 方法和 hashCode() 方法

- - ImportNew
Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码. equals()和hashCode()都不是final方法,都可以被重写(overwrite). 本文介绍了2种方法在使用和重写时,一些需要注意的问题. Object类中equals()方法实现如下:.