31

I want to add a key, value pair into a hashtable (or any other collection) but have to maintain insertion order. How can I do this?

Like I'll add 1 as key "one" as value, 2 as key and "two" as value.

The output should be:

1:one
2:two
double-beep
  • 5,031
  • 17
  • 33
  • 41
sarah
  • 2,387
  • 13
  • 43
  • 50

3 Answers3

71

Here are the characteristic differences of some important Map implementations:

  • LinkedHashMap: "with predictable iteration order [...] which is normally the order in which keys were inserted into the map (insertion-order)."
  • HashMap: "makes no guarantees as to the order of the map"
  • TreeMap: "is sorted according to the natural ordering of its keys, or by a Comparator"

So it looks like LinkedHashMap is what you need in this case.

Here's a snippet to illustrate the differences; it also shows a common way to iterate over all entries of a Map, and how using an interface to refer to objects allow great flexibility of choice of implementation.

import java.util.*;
public class MapExample {
    public static void main(String[] args) {
        populateThenDump(new HashMap<String,Integer>());
        populateThenDump(new TreeMap<String,Integer>());
        populateThenDump(new LinkedHashMap<String,Integer>());
    }
    static void populateThenDump(Map<String,Integer> map) {
        System.out.println(map.getClass().getName());

        map.put("Zero",  0);
        map.put("One",   1);
        map.put("Two",   2);
        map.put("Three", 3);
        map.put("Four",  4);

        for (Map.Entry<String,Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " => " + entry.getValue());
        }
    }
}

The output of the above snippet is (as seen on ideone.com):

java.util.HashMap          // unordered, results may vary
Three => 3
Zero => 0
One => 1
Four => 4
Two => 2
java.util.TreeMap          // ordered by String keys lexicographically
Four => 4
One => 1
Three => 3
Two => 2
Zero => 0
java.util.LinkedHashMap    // insertion order
Zero => 0
One => 1
Two => 2
Three => 3
Four => 4

Related questions

Similar questions

Community
  • 1
  • 1
polygenelubricants
  • 376,812
  • 128
  • 561
  • 623
  • 1
    Anybody else nervous about the doc's use of the world 'normally'? The excerpt "normally the order in which keys were inserted into the map" seems a little uncertain. Has anyone had any problems? – atreat Jul 23 '14 at 21:12
11

For hash table, use LinkedHashMap class.

Ash
  • 9,296
  • 2
  • 24
  • 32
Peter Štibraný
  • 32,463
  • 16
  • 90
  • 116
2

You are searching for the LinkedHashMap class.

aboger
  • 2,214
  • 6
  • 33
  • 47
Pedantic
  • 1,368
  • 10
  • 39
  • 70