java随笔

HashSet --- LinkedHashSet

2017-06-27  本文已影响44人  71150ce14a00

Collection接口
---List接口集合: 可以保存重复元素,拥有下标,存储有序,可以存储多个null元素
-------------ArrayList类: 底层是可变数组,根据下标进行操作,查询速率快,增删效率低
-------------LinkedList类: 底层是链表,根据链表的头尾进行操作,增删速率快,查询速率低
---Set集合接口:不能保存重复元素,没有下标,可以存储null但只能有一个,并且不保证存取顺序,也就是说对于集合set进行存取操作的时候没有任何顺序和规律可言,(1)set接口中没有自己的特有函数,所有的函数都是来源于collection接口,(2) set集合没有角标,只能通过Iterator迭代器遍历获取元素,set集合不能使用ListIterator迭代器,ListIterator只针对list集合特有
---------------HashSet类:
1.实现了set接口,具备set集合的属性

  1. 不保证集合中的迭代顺序,允许存储null元素,不能存储重复元素
  2. 底层使用哈希表结构,保证对象唯一依赖于hashCode和equals函数生成的哈希码值,然后结合数组长度计算数组下标
    特点: 查询元素和添加不重复元素效率比较快
    -----------------------------------LinkedHashSet类HashSet集合的子类:没有自己的特有方,底层使用链表+哈希表结构,他和HashSet集合的区别是,LinkedHashSet是一个可以保证存取顺序的集合,并且LinkedHashSet集合中元素也不能重复
  3. 存储有序(底层有一个链接表),链表记录着存储数据的顺序
  4. 保证元素的唯一(哈希表),哈希表是真正存储数据的地方
  5. 线程不安全,效率高

哈希表底层通过:hashCode和equals算法结合,来保证对象数据在HashSet集合中不重复唯一,并且存储的顺序不固定。
哈希表:数组+hashCode+equals函数,哈希表保证对象唯一需要依赖对象hashCode和equals方法
哈希表底层其实还是一个数组,元素在存储的时候,会先通过hashCode算法结合数组长度得到一个索引,然后判断索引位置是否有元素,如果没有,不用调用equals函数,如果有,再调用元素equals方法比较是否相同,相同直接舍弃,不同则划一个空间存储(拉链法)

HashSet总结:

1.HashSet集合的底层使用的哈希表结构。那么久要存储放的对象必须具备hashCode功能,由于任何一个父类都是object类,而hashCode函数定义在object类中,因此所有的对象都具备hashCode功能。
2.如果我们把一个对象可以正确的存放在HashSet集合中,这个对象所属的类一般都需要复写hashCode函数,建立本类自己的计算哈希值方式:(以为equals比较的是地址,如果不复写没有意义,string类复写了hashCode和equals)
3.如果在HashSet集合中要保证对象唯一,不能仅仅依靠hashCode函数,还要依赖于对象equals函数,当hashCode函数计算出来的哈希值相同的时候,还需要调用equals方法比较2个对象是否相同
4.要求在向HashSet集合中存储数据自己定义的一个类对象的时候,那么必须在这个自定义类中复写object类中的hashCode和equals方法。

  1. 注意当向HashSet集合中存储数据的时候,对象一定会调用hashCode函数计算下标,但不一定调用equals函数,只有计算下标相同时才会调用equals函数,否则不会调用equals函数比较。

LinkedHashSet:存储有序,数据唯一
底层是链表+哈希表
链表: 保证数据存储有序,链表用来记录存储顺序
哈希表: 保证数据唯一,存储真正的数据

Vector类属于线程安全的集合类,效率比较慢,现在开发基本不使用
Enumeration遍历Vector集合,也可以用Iterator
for(Enumeration en = list.elements();en.hasMoreElements();){
System.out.println(en.nextElement());
}

上一篇 下一篇

猜你喜欢

热点阅读