java中的hashcode作用

标签: java hashcode | 发表时间:2014-11-17 18:17 | 作者:什么都不懂的孩子
出处:http://www.iteye.com

根据API文档,java中的hashcode事实上是跟equals是有着密切联系的,hashcode是为了提高哈希表的性能

下面的话来自JDK:

hashCode 
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

 

public native int hashCode(); 
说明是一个本地方法,它的实现是根据本地机器相关的。当然我们可以在自己写的类中覆盖hashcode()方法,比如String、Integer、Double。。。。等等这些类都是覆盖了hashcode()方法的。例如在String类中定义的hashcode()方法如下: 
   

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; 
} 

 
解释一下这个程序(String的API中写到): 
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希码为 0。) 

 

在集合中,比如HashSet中,要求放入的对象不能重复,那么首先会调用hashcode,如果hashcode相等,则继续调用equals,也相等,则认为重复。

如果重写equals后,如果不重写hashcode,则hashcode就是继承自Object的,返回内存编码,这时候可能出现equals相等,而hashcode不等,你的对象使用集合时,就会等不到正确的结果

 

 

 

 



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


ITeye推荐



相关 [java hashcode] 推荐:

java中的hashcode作用

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

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

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

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

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

如何正确实现 Java 中的 HashCode

- - ImportNew
相等 和 Hash Code. 从一般角度来看,Equality 是不错的,但是 hash code 更则具技巧性. 如果我们在 hash code上多下点功夫,我们就能了解到 hash code 就是用在细微处去提升性能的. 大部分的数据结构使用equals去检查是否他们包含一个元素. 这个变量 contains 是true.

深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用

- - 编程语言 - ITeye博客
对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例;又可以说是判断对象实例是否物理相等;. 对比两个对象实例是否相等. 当对象所属的类没有重写根类Object的equals()方法时,equals()判断的是对象实例的ID(内存地址),是否是同一对象实例;该方法就是使用的等号(==)的判断结果.

关于hashcode与equal函数

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

为什么要重写equles和hashcode

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

hashCode equal避免的几个误区

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

hashCode()方法的性能优化

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

hashcode和equals区别和联系

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