java的hashCode方法

首先,想要明白hashCode的作用,你必须要先知道Java中的集合。总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那 么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是,如果每 增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001 个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。     于是,Java采用了哈希表的原理。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。如果详细讲解哈希算法,那需要更多的文章篇幅,我 在这里就不介绍了。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际上并不是真正的在内存的物理地址,不过可以这样理 解)。     这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定 位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的 equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。     所以,

Java对于eqauls方法和hashCode方法是这样规定的:

1、如果两个对象相同,那么它们的hashCode值一定要相同;

2、如果两个对象的hashCode相同,它们并不一定相同     上面说的对象相同指的是用eqauls方法比较。 你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。

如果你改写了equal()方法,令两个实际不是一个对象的两个实例在逻辑上相等了,但是hashcode却是不等。

所以要记得改写hashcode。

不改写会带来什么后果呢?当然,比如你在用hashmap,hashtable之类的设计hashcode的类的时候,就会出麻烦了。

至于如何改写一个hashcode,这就有好有坏了,看各人的功底了。现在还有专门的人在研究优秀的hash算法。

也就是说 List 是一个有序的、可重复的对象容器接口,Set是一个无序的、不可重复的对象容器接口 。后面都讲了 Set 是如何实现不重复的 :为了避免多次重复的使用 equal 方法带来的系统负担 ,set 首先调用hashCode 方法来检测 是否被占用 如果被占用 然后调用 equal 方法判断被占用的是否相同

选自:

http://hi.baidu.com/platon/blog/item/3793bb0edd399ee437d122e1.html/cmtid/917a247fe974960e29388a6a

Rating: 4.0/10 (1 vote cast)

Related posts:

  1. C# delegate 委托变量的用法 using System; //C#中的委托类似于C或C++中的函数指针,但两者有本质区别:C或C++不是类型安全的,但C#中的委托是面向对象的,而且是类型安全的。 //从技术角度来讲==>委托是一个引用类型,用来封装带有特定签名和返回类型的方法 namespace qinmi { public delegate int...
  2. LineBuzz 一个非常酷的comment系统。你只要highlight一下,就可以马上就这段话进行评论了。这是一个非常实用又非常酷的工具。LineBuzz adds inline comments to your blog. Installing 1 line...
  3. The Official Palm Blog: Got opinions? Become a Real Reviewer and get a new phone courtesy of Palm Got opinions? Become a Real Reviewer and get a new...
  4. Everyone must see - How to put off oil fire in kitchen Little tip may save your life!...
  5. How to twist wordpress plugin into wpmu sometimes, we are just so stupid that wanna directly dump...

Leave a Reply

Preview:

Tags:
Separate individual tags by commas