Does HashTable maintains the insertion order?

32,111

Solution 1

No, it does not. To preserve insertion order, instead use java.util.LinkedHashMap (javadoc).

Also, HashMap is now preferred over Hashtable, because Hashtable has unnecessary concurrency overhead. (See Differences between HashMap and Hashtable?.)

Solution 2

no, it does not. it only knows the "hash" order. if you reorder the strings, you will find they still appear in the same order from the hashtable.

Solution 3

Hashtable is used for fast lookup not for maintaining order. You should look into LinkedHashMap or other data structures.

Solution 4

LinkedHashMap is used for maintaining order of inserting elements.. Hashtable is similar to HashMap but it doesn't allow null key or value while HashMap allows one null key and several null values...

Solution 5

From Map Javadoc.

The order of a map is defined as the order in which the iterators on the map's collection views return their elements. Some map implementations, like the TreeMap class, make specific guarantees as to their order; others, like the HashMap class, do not.

Also it's very useful to look inside the code of Hashtable and HashMap.

Share:
32,111
wayfare
Author by

wayfare

Updated on June 03, 2020

Comments

  • wayfare
    wayfare about 4 years

    The following code gives me the output in the same order of insertion. I read the javadoc and they did not even talk about the insertion order. Can someone help me to get the right information.

    import java.util.*;
    
    public class hash {
    
    public static void main(String[] args) {
    
        String str[] = { "japan",
                "usa",
                "japan",
                "russia",
                "usa",
                "japan",
                "japan",
                "australia"};
        int len = 8;
        Hashtable ht = new Hashtable();
        int i = 0;
        while (i < len) {
    
            String c = str[i];
            System.out.println("c :" + c);
            Integer intg = (Integer) ht.get(c);
    
            if (intg == null)
                ht.put(c, new Integer(1));
            else
                ht.put(c, new Integer(intg.intValue() + 1));
    
            i++;
        }
    
        Enumeration k = ht.keys();
    
        while (k.hasMoreElements()) {
            String key = (String) k.nextElement();
            System.out.println(key + " > " + ht.get(key));
        }
    }
    }
    
  • Stephen C
    Stephen C about 13 years
    "if you reorder the strings, you will find they still appear in the same order from the hashtable" - not always true. If there are collisions, then the hashtable order will depend on the key insertion order. So an attempt to reorder could change hashtable order, though not in the way that you want.
  • jcomeau_ictx
    jcomeau_ictx about 13 years
    correct. I meant only to say that a trivial reordering of these particular strings yielded the same output.
  • wayfare
    wayfare almost 13 years
    LinkedHasMap is a very good Implementation when we also want the ordering in hashmap. I was trying to search for a good design or pseudo-code for the same but was not able to find any. If you are aware of any of the links then please share.