首页 > 代码库 > hashSet linkedHashSet treeSet 一点区别

hashSet linkedHashSet treeSet 一点区别

上代码先:

	  Set<String> hashSet=new HashSet<String>();
	  hashSet.add("thireBottom");
	  hashSet.add("thirdTop");
	  System.out.println(hashSet);
	  
	  Set<String> linkedSet=new LinkedHashSet<String>();
	  linkedSet.add("thireBottom");
	  linkedSet.add("thirdTop");
	  System.out.println(linkedSet);
	  
	  Set<String> treeSet=new TreeSet<String>();
	  treeSet.add("thirdTop");
	  treeSet.add("thireBottom");
	  System.out.println(treeSet);

结果如下:

[thirdTop, thirdBottom]
[thirdBottom, thirdTop]
[thirdBottom, thirdTop]


工作了许久有时候也没注意到这些细节上的东西,今天刚好碰到一个需求就是要求Set集合按照一定的顺序输出,翻了下hashSet的源码,简单mark下.

对于hashSet这个集合,本质是基于hashMap的ketSet()实现的.  keySet()类似一个数组集合, 当往里面add数据的时候, 会先计算该数据的hashCode值, 根据该值存入到数组集合中.例子中: thirdTop 的hashCode值对应的数组下标排在thirdBottom前面,所以输出 thirdTop, thirdBottom

结论: hashSet 中的数据排序和你插入顺序无关, 也没有指定的排序方法供你选择, 结果可以简单理解为不可预知的(其实还是根据hashCode来的)

linkedHashSet 数据插入不是基于数组,而是以链式存储,通过前后指针相互关联.所以数据插入顺序决定了输出顺序

treeSet <E> 相比上面则提供了,排序的方法。 插入的对象必须实现 comparable接口以提供排序方法, 如果是字符串默认就是按照字母顺序排序。


hashSet linkedHashSet treeSet 一点区别