Set中的通用实现:

HashSet、TreeSet和LinkedHashSet。

区别:

HashSet比TreeSet快很多(大多数情况下常量时间对log时间),但并不保证提供排序。如果你想在SortedSet接口中使用,或者要求使用根据值大小的排序,那么使用TreeSet;否则,使用HashSet。可以断定最后大部分时间使用的都是HashSet。
LinkedHashSet在某种意义上来说,介于HashSet和Tree之间。以有链表贯穿哈希表方式实现的LinkedHashSet提供插入排序迭代(最晚插入的元素放置最近的地方),而且运行的速度几乎和HashSet一样快。LinkedHashSet实现让它的用户不必担心HashSet中未指定通常很乱的排序,也没有产生TreeSet中的额外代价。

关于HashSet一个值得牢记的事情:

HashSet中的迭代是与其记录总数和其桶的大小(容量)呈线性的。因此,把初始容量设置的太高,不仅浪费空间也浪费时间。另一方面,把初始容量设置得过低,会导致每次必须扩充容量时对数据结构进行复制,从而浪费太多时间。如果不指定初始容量,默认大小是16.


专用set实现:
共有两种:EnumSet和CopyOnWriteArraySet。

EnumSet是对枚举类型来说高性能的set实现。枚举set中的所有元素都必须是相同的枚举类型。
CopyOnWriteArraySet是在一个写时复制数组上的Set实现。此策略可以最优地使用资源。