前面我们已学习了ArrayList、LinkedList、HashMap、HashTable、TreeMap,接下来我们来学习HashSet。 首先我们对HashSet有一个整体的认识,然后学习它的源码,最后通过代码示例学会使用它。
HashSet是由HashMap实现的,所以底层也是散列表(数组+链表)。 HashMap是无序的,且不允许元素重复,但HashSet允许元素为空。 HashSet是非同步的。如果多个线程同时访问一个HashSet,若其中至少一个线程修改了该set,那么就必须保持外部同步。这通常是通过封装该set的对象执行同步操作来完成的。 如果不存在这样的对象,则应该使用Collections.synchronizedSet(同步set)方法来包装set。在创建时完成该操作:
Set s = Collections.synchronizedSet(new HashSet(...));HashSet通过Iterator()返回的迭代器也是Fail-Fast机制。 易考点:
关注点 | 结论 |
---|---|
结合底层实现的数据结构 | 由HashMap实现,散列表(数组+列表) |
集合中元素是否允许为空 | Key和value都可以为空 |
是否允许数据重复 | 不允许元素重复 |
是否有序 | 无序,是指不是按put进来的顺序 |
是否线程安全 | 非线程安全(不是同步的) |
1>HashSet与Map关系如下图: 从中可以得到: a.HashSet继承于AbstractSet,并且实现了Set接口; b、HashSet不允许元素重复,底层是由HashMap实现的。HashSet中哈有一个HashMap类型的成员变量map,HashSet的操作函数,都是基于map实现的。 2>HashSet的构造函数 1、默认构造函数
运行结果如下:
size : 5HashSet contains a :trueHashSet contains g :falsefor each : afor each : bfor each : cfor each : dremoveset : [a, d]retainset : [b, c]iterator : aiterator : biterator : citerator : dset is empty文章只是作为自己的学习笔记,借鉴了网上的许多案例,如果觉得阔以的话,希望多交流,在此 谢过…
新闻热点
疑难解答