这几天看了下容器的源码,总结一下HashSet vs TreeSet vs LinkedHashSet的区别, 如下图,collection的继承实现分支,这里先只讲解set分支
1、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
(2) TreeSet:TreeSet实际上是TreeMap实现的。当我们构造TreeSet时;若使用不带参数的构造函数,则TreeSet的使用自然比较器;若用户需要使用自定义的比较器,则需要使用带比较器的参数。
参考:http://www.cnblogs.com/skywang12345/p/3311268.html
(3) LinkedHashSet: LinkedHashSet也是一个集合,与HashSet不同的是,LinkedHashSet是有序的,由于其继承了HashSet,所以构造方法中调用的是HashSet的构造方法,在HashSet的构造方法中有一个专门为LinkedHashSet重写的构造方法。并且其内部利用LinkedHashMap实现的。
参考:http://blog.csdn.net/wxl1234579/article/details/54971525
总结:
使用Set集合的主要原因是因为Set集合里面没有重复的元素。Set集合有三个常见的实现类:HashSet,TreeSet,LinkedHashSet。什么时候,选择哪一个使用非常重要。简单的说,如果你关注性能,应该使用HashSet;如果你需要一个有序的Set集合,应该使用TreeSet;如果你需要一个Set集合保存了原始的元素插入顺序,应该使用LinkedHashSet。
注意:如果要详细研究set的原理,请去查看相对应的map实现
来源:oschina
链接:https://my.oschina.net/u/3196846/blog/1552616