1.问题
今天学习数据结构哈希表,知道了哈希表的牺牲了顺序性,从而保证了效率。然后我想到了java中的 hashset和Treeset,我记得以前学习set的时候,老师说set元素是有序的,有就是说,hashset 和 treeset都是有序的。可是现在在学习数据结构的时候发现hashset 是无序的, treeset 是有序的,那这就和前面所说的set是有序的互相矛盾了,所以让来验证一下,如下:
使用的是 java 8
HashSet<Integer> set = new HashSet<>();
set.add(3);
set.add(1);
set.add(2);
System.out.println("HashSet : " + set);
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
System.out.println("TreeSet : " + treeSet);
HashSet : [1, 2, 3]
TreeSet : [1, 2, 3]
从结果得知,hashset和 treeset都是有序的输出元素了。
这样的结果其实和我前面所讲的哈希表牺牲了有序这一命题所矛盾了,可是哈希表确实是牺牲了有序性,那么问题在哪里呢?
2.hashset实现原理
仔细回想,不难发现hashset底层使用hashmap来实现的,set的元素存放在map的