首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

HashSet引见

2012-10-24 
HashSet介绍(1) 为啥要用HahSet?假如我们现在想要在一大堆数据中查找X数据。LinkedList的数据结构就不说了,

HashSet介绍
(1) 为啥要用HahSet?
    假如我们现在想要在一大堆数据中查找X数据。LinkedList的数据结构就不说了,查找效率低的可怕。ArrayList哪,如果我们不知道X的位置序号,还是一样要全部遍历一次直到查到结果,效率一样可怕。HashSet天生就是为了提高查找效率的。

(2) hashCode 散列码
     散列码是由对象导出的一个整数值。在Object中有一个hashCode方法来得到散列码。基本上,每一个对象都有一个默认的散列码,其值就是对象的内存地址。但也有一些对象的散列码不同,比如String对象,它的散列码是对内容的计算结果:

Java代码 

//hashCode与equals方法的兼容public class Employee{       public int id;       public String name="";       //相同id对象具有相同散列码       public int hashCode(){               return id;       }       //equals必须比较id        public boolean equals(Employee x){              if(this.id==x.id) return true;              else return false;       }}     
   
   为什么要这样,因为HashSet不允许相同元素(equals==ture)同时存在在结构中。假如employeeX(1111,“张三”)和employee(1111,"李四"),而Employee.equals比较的是name。这样的话,employeeX和employeeY的equals不相等。它们会根据相同的散列码1111加入到同一个散列单元所指向的列表中。这种情况多了,链表的数据将很庞大,散列冲突将非常严重,查找效率会大幅度的降低。
(6) 总结一下
    1、HashSet不能重复存储equals相同的数据 。原因就是equals相同,数据的散列码也就相同(hashCode必须和equals兼容)。大量相同的数据将存放在同一个散列单元所指向的链表中,造成严重的散列冲突,对查找效率是灾难性的。

    2、HashSet的存储是无序的 ,没有前后关系,他并不是线性结构的集合。

    3、hashCode必须和equals必须兼容, 这也是为了第1点。

热点排行