谁看过LinkedHashSet的源码,我怎么没看出来它跟HashSet的实现有任何不同

解决方案 »

  1.   

    public class LinkedHashSet<E>
        extends HashSet<E>
        implements Set<E>, Cloneable, java.io.Serializable {    private static final long serialVersionUID = -2851667679971038690L;    public LinkedHashSet(int initialCapacity, float loadFactor) {
            super(initialCapacity, loadFactor, true);
        }    public LinkedHashSet(int initialCapacity) {
            super(initialCapacity, .75f, true);
        }    public LinkedHashSet() {
            super(16, .75f, true);
        }    public LinkedHashSet(Collection<? extends E> c) {
            super(Math.max(2*c.size(), 11), .75f, true);
            addAll(c);
        }
    }
      

  2.   

    在实际使用中有很大的区别,HashSet迭代的顺序是不固定的,LinkedHashSet的迭代顺序是固定的
      

  3.   

    咋回事呢?个人感觉Set不是不保证迭代顺序的嘛,LinkedHashSet本质上讲依旧是个Set
    莫非就是一个true保证了迭代顺序???
      

  4.   

    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
        }
    LinkedHashSet始终调用LinkedHashMap,也就是说它跟LinkedHashMap差不多,而Map有迭代循序
      

  5.   

    你仔细看它调用的父类构造函数,实际上调用的是
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
    }它的顺序由LinkedHashMap保证的(LinkedHashMap中的Entry有前一个和后一个的引用)
      

  6.   

    很奇怪是吧,答案其实是在他的父类 HashSet里面:
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
                  map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
             }
    通过LinkedHashMap 来实现排序的。至于为什么HashSet却没有排序的功能,那就要注意到这个构造方法是default的,只有ui包能访问到,外界是不能调用这个构筑器的,为什么这样设计还有待研究啊。