HashSet是Set接口的典型实现,大多数使用set集合时就是使用这个实现类.HashSet是按照Hash算法来存储集合中的元素,所以具备很好的存取和查找性能.算法
HashSet具备如下特色:数据结构
- 不能保证元素的排列有序,顺序可能与添加的顺序不一样,顺序可能发生变化
- HashSet不是同步的,若是多个线程同时访问一个HashSet,假设两个或者两个以上的线程同时修改了Hashset集合时,则必须经过代码来保证其同步
- 集合中的元素能够是null
当向HashSet集合中的存入一个元素时,HashSet会调用该对象的hashCode()方法来获得该对象的hashCode值,而后根据该hashCode值决定该对象的HashSet中的位置.若是有两个元素经过equals()方法返回true,但他们的hashCode()方法返回值不相等,HashSet将会把它们存储在不一样的位置,依然能够添加成功. 也就是说,HashSet集合判断两个元素相等的标准是两个对象经过equals()方法比较相等,而且两个对象的hashCode()方法返回值也相等.性能
注意:线程
若是须要把某个类的对象保存到Hashset集合中,重写这个类的equals()方法和hashCode()方法时,应该尽可能保证两个对象经过equals()方法比较返回true时,他们的hashCode()方法的返回值也相等对象
重写hashCode()方法的基本规则:排序
- 在程序运行的过程当中,同一个对象屡次调用hashCode方法应该返回相同的值.
- 当两个对象经过equals()方法比较返回true时,这两个对象的hashCode()方法应该返回相等的值
- 对象中用做equals()方法比较标准的实例变量,都应该用于计算hashCode值
LinkedHashSet也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来像是以插入的顺序保存的(虽然LinkedHashSet 使用了链表的记录集合元素的添加顺序,但LinkedHashset依然是HashSet,所以它依然不容许集合元素的重复)接口
TreeSet类是sorted接口的实现类,TreeSet能够确保集合元素处理排序的状态.与TreeSet还提供了以下几个额外的方法:同步
TreeSet并非根据元素的插入顺序进行排序的,而是根据元素的实际的大小来进行排序的.hash
与HashSet集合采用的hash算法来决定元素的存储位置不一样,TreeSet采用红黑树的数据结构来存储集合元素class
TreeSet支持两种排序方法:天然排序和定制排序.在默认状况下采用天然排序.