浅谈Java中的hashcode方法 -----> http://www.cnblogs.com/dolphin0520/p/3681042.html html
首先,想要明白hashCode的做用,你必需要先知道Java中的集合。java
总的来讲,Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素能够重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。可是,若是每增长一个元素就检查一次,那么当元素不少时,后添加到集合中的元素比较的次数就很是多了。也就是说,若是集合中如今已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大下降效率。因而,Java采用了哈希表的原理。哈希(Hash)其实是我的名,因为他提出一哈希算法的概念,因此就以他的名字命名了。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。若是详细讲解哈希算法,那须要更多的文章篇幅,我在这里就不介绍了。初学者能够这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并非)。程序员
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一会儿能定位到它应该放置的物理位置上。若是这个位置上没有元素,它就能够直接存储在这个位置上,不用再进行任何比较了;若是这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。因此这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大下降了,几乎只须要一两次。算法
因此,Java对于eqauls方法和hashCode方法是这样规定的:编程
一、若是两个对象相同,那么它们的hashCode值必定要相同;api
二、若是两个对象的hashCode相同,它们并不必定相同,上面说的对象相同指的是用eqauls方法比较。数据结构
你固然能够不按要求去作了,但你会发现,相同的对象能够出如今Set集合中。同时,增长新元素的效率会大大降低。编码
这是一种算法,数据结构里面有提到。在某一个地址上(对应一个哈希值,该值并不特指内存地址),存储的是一个链表。在put一个新值时,根据该新值计算出哈希值,找到相应的位置,发现该位置已经蹲了一个,则新值就连接到旧值的下面,由旧值指向(next)它(也多是倒过来指。。。)。能够参考HashMap。spa
能够把hashcode理解为,一大片有编号的桶,若是你的散列算法好的话,能够保证每一个不一样的对象能够放在不一样的桶里面,也就是每一个不一样的对象都有不一样的HashCode(同上的编号)。这样的话,若是你寻找某个对象的时候,计算一下这个对象的hashcode而后直接就能够到对应的桶里面取道这个对象。翻译
可是若是你的散列算法很差的话,也就是任何对象都有一个相同的hashCode,也就是说如今以后一个桶了,你全部的对象都要放在这个桶里面,这样的话,当你寻找某个对象的时候,虽然能够很快肯定要去那个同里面寻找,可是若是桶里面有几千万个对象,那样的话你就须要逐个调用equals了。效率就太差了.
hash code是一种编码方式,在Java中,每一个对象都会有一个hashcode,Java能够经过这个hashcode来识别一个对象。至于hashcode的具体编码方式,比较复杂(事实上这个编码是能够由程序员经过继承和接口的实现重写的),能够参考数据结构书籍。而hashtable等结构,就是经过这个哈希实现快速查找键对象。这是他们的内部联系,但通常编程时无需了解这些,只要知道hashtable实现了一种无顺序的元素排列就能够了。.
两个对象值相同(x.equals(y) == true),则必定有相同的hash code。
由于:Hash,通常翻译作“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫作预映射, pre-maping),经过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间一般远小于输入的空间,不一样的输入可能会散列成相同的输出,而不可能从散列值来惟一的肯定输入值。
如下是java语言的定义:
1) 对象相等则hashCode必定相等;
2) hashCode相等对象未必相等。
这也涉及到如何写自定义的hashCode方法的问题:必须符合以上条件。注意条件2中的未必。具体可参见java doc; Effective Java中有更详细论述。
补充一点我的简介 hash 就是 相似于数学集合, 每个键,k能够对应一个或多个值,对象就相似于值,因此“相同的对象”具备相同的键值,也就是hashCode;
关键特性:单向性 抗冲突性 映射分布均匀性和差分分布均匀性
而MD5能够说是目前应用最普遍的Hash算法