35 、HashSet详解
2016-05-28 19:14
351 查看
[b]HashSet特点[/b]
1、不能保证元素的排列顺序
2、没有重复元素
3、HashSet不是同步的,多个线程同时访问一个HashSet,需要通过代码来保持同步
4、集合元素可以是null
当向HashSet中添加元素时,通过对象的HashCode方法来决定元素的存储位置。当两个元素equals相同,HashCode不相同时,HashSet也会看作两个不同元素;当两个元素HashCode相同,equals不同时,HashSet试图把它们保存着同一个位置,但又不行,所以实际上回在这个位置使用链式结构来保存多个对象,这样导致性能下降。
案例:
输出结果:[B@1, B@1, C@2, A@6bbc4459, A@7150bd4d]
【注意】:如果要把某个类的对象保存到HashSet集合中,重写这个类的equals方法和hashCode方法时,应该尽量保证两桶对象通过equals方法比较返回为true时,它们的hashCode方法返回值也相等
LinkedHashSet类
HashSet还有一个子类,LinkedHashSet,LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序来保存的。也就是说,当遍历LinkedHashSet集合里的元素时,会按照元素插入顺序来访问元素。
正因为LinkedHashSet需要维护元素的插入顺序,所以性能略低于HashSet,但是在迭代方位Set里的全部元素时将会有很好的性能
1、不能保证元素的排列顺序
2、没有重复元素
3、HashSet不是同步的,多个线程同时访问一个HashSet,需要通过代码来保持同步
4、集合元素可以是null
当向HashSet中添加元素时,通过对象的HashCode方法来决定元素的存储位置。当两个元素equals相同,HashCode不相同时,HashSet也会看作两个不同元素;当两个元素HashCode相同,equals不同时,HashSet试图把它们保存着同一个位置,但又不行,所以实际上回在这个位置使用链式结构来保存多个对象,这样导致性能下降。
案例:
class A{ public boolean equals(Object obj) { return true; } } class B{ public int hashCode() { return 1; } } class C{ public boolean equals(Object obj) { return true; } public int hashCode() { return 2; } } public class Test{ public static void main(String[] args) { Set set=new HashSet(); set.add(new A()); set.add(new A()); set.add(new B()); set.add(new B()); set.add(new C()); set.add(new C()); System.out.println(set); } }
输出结果:[B@1, B@1, C@2, A@6bbc4459, A@7150bd4d]
【注意】:如果要把某个类的对象保存到HashSet集合中,重写这个类的equals方法和hashCode方法时,应该尽量保证两桶对象通过equals方法比较返回为true时,它们的hashCode方法返回值也相等
LinkedHashSet类
HashSet还有一个子类,LinkedHashSet,LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序来保存的。也就是说,当遍历LinkedHashSet集合里的元素时,会按照元素插入顺序来访问元素。
正因为LinkedHashSet需要维护元素的插入顺序,所以性能略低于HashSet,但是在迭代方位Set里的全部元素时将会有很好的性能
相关文章推荐
- ES5中新增的Array方法详细说明
- java设计模式-观察者模式(广播机制,消息订阅)
- 清除浮动clear/BFC
- 操作Android手机路由表
- [置顶] php超级预定数组( 类似javaWeb中域对象),函数,对象,进一步加深知识点
- 数据结构上机测试2-1:单链表操作A
- 随笔—邀请赛前练— Duff in Love
- Codeforces Round #353 (Div. 2) D. Tree Construction (BST询问父亲节点)
- nyoj 712 第六届河南省大学生程序设计竞赛D +nyoj 61
- html5中图像元素
- 更新kernel
- make: 'pcs.o' is up to date.问题解决
- mysql唯一索引和unique
- CopyOnWriteArrayList&CopyOnWriteArraySet
- boost库使用快速入门
- java join()方法
- Android oncreate中获取控件宽高
- zoj3541(区间dp+贪心)
- Unity3D——游戏序列化
- mac os x使用Git简易入门教程