(java 必备知识之三) 浅谈java散列原理,为什么java需要散列集合?

来源:互联网 发布:nginx泛解析 编辑:程序博客网 时间:2024/06/05 15:07

  笔者认为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”

 

 

 

 

注:如有不对之处请指出。

 

原创粉丝点击