HashSet与TreeSet为什么无序?
HashSet在插入元素时根据元素的hashCode()方法,确定元素位置;如果此位置上有元素再用equals()方法进行判断,如果判断为true则不能插入此元素,如果为false则在此元素位置上以双向链表的形式连在原来元素后;那么可不可以理解为:hashset所谓无序就是插入元素时不是按插入顺序进行存放元素的,但是插入后所有元素的位置就确定了,所以将一组泛型数据插入hashset后输出的元素顺序始终不变!
public class Test{
public static void main(String[] args){
Set<Integer> set = new (代码)<Integer>();
set.add(new Integer(2));
set.add(new Integer(1));
System.out.println(set);
}
}
插入代码运行的结果一定是[1,2]的选项为(B)
A HashSet;
B TreeSet;
答案为什么是TreeSet!
我做过实验了结果证明了上面的理论,但是这道笔试题我不知道为什么选TreeSet。TreeSet输出的结果和HashSet一样都是[1,2]求大神解释!
------解决方案--------------------TreeSet是有排序效果的,其他没有
------解决方案--------------------HashSet 是 基于HashMap实现的,HashMap每次存值时,先会对key的hashcode()方法返回值再算一次hash。
Integer的hashCode方法返回的就是它自己,所以这个测试是个特例,Set里面如果不是Integer类型就不一定会保持顺序了。
------解决方案--------------------你可以自己写个POJO类,存一下就知道了。
------解决方案--------------------Tree算法和Hash算法的区别
------解决方案--------------------TreeSet 存放的是实现 Comparable接口的。
Integer实现的Comparable按大小升序。
所以输出是有序的整数