笔者认为java知所已要使用散列集合,是因为java中的集合需要更快的查询效率。大家都听说过一句“古话”:为了速度而散列。 这其实
已经告诉我们散列的作用。有很多人都忽略了散列的重要性,只是把他当成一个集合中对像的唯一标识。其实不然。
那么散列在java中主要体现在哪里呢?
为什么需要散列
如果有一群小猪,比方说有20只小猪。它们重量都非常接近,现在如果把他们放到一个猪圈里,你如果想要找到一个10公斤的那只小猪,
那是多么难的一件事情。你非得一个个称一下,直到找到你要找的那只小猪。(10公斤的那只)
但是如果我构造20个猪栏来放置这20只小猪,并且每只小猪都设置一个hashcode值,这个值分别对应猪栏,然后把符合hashcode值的
小猪分别放在不同的栏里,这样1只小猪一个栏。像贴了标签一样。当你要找10公斤的那只小猪时,只需要按标签找就能快速的索引到了,
这时我们就可以把hashcode当成是一个记录的索引。散列的原理也是如此。
众所周知的hash算法
众所周知的hash算法也是如此,就是在一个散列表里添加记录的索引来快速索引与定位数据。所以java中的散列集合也就是这么产生的。
致于如何加速索引,还需要有合适的hashcode算法,在存放大数据集的时候若hashcode太过分散,散列过大也会造成性能的影响。影响
数据的索引定位。你构造20个猪栏没问题,成本也不见得多。但是如果是叫你构造1W或是更多的猪栏来存放小猪时,这时你的成本就大
了。所以说不同的应用需要选用合适的hashcode算法就是这样的道理。
java中的常用散列集合如下:
java中常用的散列集合如:hashtable,hashmap,hashset 等。
java中的散列集合的Hashcode
hashcode 方法本为Object 中的方法,这里利用Set集合来做举例,它充分体现了Hashcode的作用,Set是属于无序集合,里面的元素
是不可以重复的。这个应该谁都知道。那么它是如何把重复元素去除的呢?Set集合对象在add时,先执行hashcode方法。并根据这个
hashcode值去Set集合里面查找该对象。如果Set集合中没有该hashcode指向,则开辟一个空间把这个对象存进来。那么add中的size
就+1。但是如果根据这个hashcode去查找Set集合中的对像,该hashcode值所指向的空间已存放了一个对像。那么就会去执行该对象的
equals方法。 比较两个相同hashcode值的对象。是否为同一对像(这里就需要我们复盖之用了,默认是比较两个对像的引用是否一致,
如果一致),如果返回true则表明两个对象是同一对象。这时Set集合就不再放置这个对象到集合列表中了。相返,如果返回false就表明两
个对象是属于有相同hashcode的非同一对象。这时对像也就被Set集合存起来了。所以在java有句话:“有相同hashcode值的对象
equals不一定相等,而equals相等的两个对象,有相同的hashcode”
注:如有不对之处请指出。