TreeMap & LinkedHashMap
TreeMap — Sorted by Key
TreeMap with natural ordering
import java.util.Map;
import java.util.TreeMap;
TreeMap<String, Integer> scores = new TreeMap<>();
scores.put("Charlie", 88);
scores.put("Alice", 95);
scores.put("Bob", 79);
System.out.println(scores); // keys come back sorted alphabetically
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}{Alice=95, Bob=79, Charlie=88}
Alice -> 95
Bob -> 79
Charlie -> 88TreeMap with a custom Comparator (descending order)
import java.util.Comparator;
import java.util.TreeMap;
TreeMap<String, Integer> byScoreDesc =
new TreeMap<>(Comparator.reverseOrder());
byScoreDesc.put("Charlie", 88);
byScoreDesc.put("Alice", 95);
byScoreDesc.put("Bob", 79);
System.out.println(byScoreDesc);{Charlie=88, Bob=79, Alice=95}Navigating a TreeMap
firstKey() and ceilingKey()
import java.util.TreeMap; TreeMap<Integer, String> priceLevels = new TreeMap<>(); priceLevels.put(10, "Bronze"); priceLevels.put(50, "Silver"); priceLevels.put(100, "Gold"); System.out.println(priceLevels.firstKey()); // smallest key System.out.println(priceLevels.ceilingKey(60)); // smallest key >= 60
10 100
LinkedHashMap — Insertion Order
LinkedHashMap preserves insertion order
import java.util.LinkedHashMap;
import java.util.Map;
Map<String, Integer> visits = new LinkedHashMap<>();
visits.put("home", 1);
visits.put("about", 2);
visits.put("contact", 3);
System.out.println(visits); // prints in the order keys were inserted{home=1, about=2, contact=3}Access-Order Mode: A Simple LRU Cache
A minimal LRU cache built on LinkedHashMap
import java.util.LinkedHashMap;
import java.util.Map;
class LruCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
LruCache(int capacity) {
super(16, 0.75f, true); // true = access-order mode
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
LruCache<Integer, String> cache = new LruCache<>(2);
cache.put(1, "a");
cache.put(2, "b");
cache.get(1); // "1" is now the most recently used
cache.put(3, "c"); // capacity exceeded, evicts the least recently used ("2")
System.out.println(cache);{1=a, 3=c}Aspect | HashMap | LinkedHashMap | TreeMap |
|---|---|---|---|
Ordering | None — unpredictable | Insertion order (or access order) | Sorted by key |
get/put time | O(1) average | O(1) average | O(log n) |
Null keys | One allowed | One allowed | Not allowed |
Backed by | Hash table | Hash table + linked list | Red-black tree |
Best for | Fastest general-purpose lookups | Predictable iteration order, LRU caches | Sorted iteration, range queries |
TreeMap keeps keys sorted (natural order or a custom Comparator) at O(log n) per operation
firstKey()/ceilingKey() and similar methods support range-style lookups
LinkedHashMap keeps HashMap's O(1) performance while preserving insertion order
LinkedHashMap's access-order constructor plus removeEldestEntry() gives you a simple LRU cache