HashSet vs LinkedHashSet

后端 未结 10 2497
暗喜
暗喜 2020-11-28 18:20

What is the difference between them? I know that

A LinkedHashSet is an ordered version of HashSet that maintains a doubly-linked List across all el

相关标签:
10条回答
  • 2020-11-28 18:59

    You should look at the source of the HashSet constructor it calls... it's a special constructor that makes the backing Map a LinkedHashMap instead of just a HashMap.

    0 讨论(0)
  • 2020-11-28 19:00

    The answer lies in which constructors the LinkedHashSet uses to construct the base class:

    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);      // <-- boolean dummy argument
    }
    
    ...
    
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);            // <-- boolean dummy argument
    }
    
    ...
    
    public LinkedHashSet() {
        super(16, .75f, true);                         // <-- boolean dummy argument
    }
    
    ...
    
    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2*c.size(), 11), .75f, true);   // <-- boolean dummy argument
        addAll(c);
    }
    

    And (one example of) a HashSet constructor that takes a boolean argument is described, and looks like this:

    /**
     * Constructs a new, empty linked hash set.  (This package private
     * constructor is only used by LinkedHashSet.) The backing
     * HashMap instance is a LinkedHashMap with the specified initial
     * capacity and the specified load factor.
     *
     * @param      initialCapacity   the initial capacity of the hash map
     * @param      loadFactor        the load factor of the hash map
     * @param      dummy             ignored (distinguishes this
     *             constructor from other int, float constructor.)
     * @throws     IllegalArgumentException if the initial capacity is less
     *             than zero, or if the load factor is nonpositive
     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
    }
    
    0 讨论(0)
  • 2020-11-28 19:09

    HashSet is unordered and unsorted Set.
    LinkedHashSet is the ordered version of HashSet.

    The only difference between HashSet and LinkedHashSet is that:
    LinkedHashSet maintains the insertion order.

    When we iterate through a HashSet, the order is unpredictable while it is predictable in case of LinkedHashSet.

    The reason for how LinkedHashSet maintains insertion order is that:
    The underlying used data structure is Doubly-Linked-List.

    0 讨论(0)
  • 2020-11-28 19:17

    HashSet:

    The underlined data structure is Hashtable. Duplicate objects are not allowed.insertion order is not preserved and it is based on hash code of objects. Null insertion is possible(only once). It implements Serializable, Clonable but not RandomAccess interface. HashSet is best choose if frequent operation is search operation.

    In HashSet duplicates are not allowed.if users are trying to insert duplicates when we won't get any compile or runtime exceptions. add method returns simply false.

    Constructors:

    HashSet h=new HashSet(); creates an empty HashSet object with default initial capacity 16 and default fill ratio(Load factor) is 0.75 .

    HashSet h=new HashSet(int initialCapacity); creates an empty HashSet object with specified initialCapacity and default fill ration is 0.75.

    HashSet h=new HashSet(int initialCapacity, float fillRatio);

    HashSet h=new HashSet(Collection c); creates an equivalent HashSet object for the given collection. This constructor meant for inter conversion between collection object.

    LinkedHashSet:

    It is a child class of HashSet. it is exactly same as HashSet including(Constructors and Methods) except the following differences.

    Differences HashSet:

    1. The underlined data structure is Hashtable.
    2. Insertion order is not preserved.
    3. introduced 1.2 version.

    LinkedHashSet:

    1. The underlined data structure is a combination of LinkedList and Hashtable.
    2. Insertion order is preserved.
    3. Indroduced in 1.4 version.
    0 讨论(0)
提交回复
热议问题