日期:2014-05-20  浏览次数:20705 次

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按大小升序。
所以输出是有序的整数