这几天看了下容器的源码,总结一下HashSet vs TreeSet vs LinkedHashSet的区别, 以下图,collection的继承实现分支,这里先只讲解set分支html
一、HashSet vs TreeSet vs LinkedHashSet三者的数据结构分析数据结构
(1)HashSet:由哈希表(其实是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类容许使用null元素。对于HashSet中保存的对象,请注意正确重写其equals和hashCode方法,以保证放入的对象的惟一性。函数
注意:hashSet是利用HashMap的key进行数据存储。同时HashMap的key具备惟一性性能
参考:http://www.cnblogs.com/ITtangtang/p/3948538.html.net
(2) TreeSet:TreeSet其实是TreeMap实现的。当咱们构造TreeSet时;若使用不带参数的构造函数,则TreeSet的使用天然比较器;若用户须要使用自定义的比较器,则须要使用带比较器的参数。htm
参考:http://www.cnblogs.com/skywang12345/p/3311268.html对象
(3) LinkedHashSet: LinkedHashSet也是一个集合,与HashSet不一样的是,LinkedHashSet是有序的,因为其继承了HashSet,因此构造方法中调用的是HashSet的构造方法,在HashSet的构造方法中有一个专门为LinkedHashSet重写的构造方法。而且其内部利用LinkedHashMap实现的。blog
参考:http://blog.csdn.net/wxl1234579/article/details/54971525继承
总结:源码
使用Set集合的主要缘由是由于Set集合里面没有重复的元素。Set集合有三个常见的实现类:HashSet,TreeSet,LinkedHashSet。何时,选择哪个使用很是重要。简单的说,若是你关注性能,应该使用HashSet;若是你须要一个有序的Set集合,应该使用TreeSet;若是你须要一个Set集合保存了原始的元素插入顺序,应该使用LinkedHashSet。
注意:若是要详细研究set的原理,请去查看相对应的map实现