Skip to main content

HashMap and HashSet

So far, every data structure covered has organized its elements by position: index 0, index 1, and so on. HashMap and HashSet instead organize elements based on their value, which makes looking things up by a meaningful identifier extremely fast.

hashmap

HashMap

A HashMap stores key-value pairs. Instead of looking something up by its position, you look it up by its key, similar to looking up a word in a dictionary.

HashMap Formula

HashMap<[key type], [value type]> [map name] = new HashMap<[key type], [value type]>();
import java.util.HashMap;

HashMap<String, Integer> subsystemCANIDs = new HashMap<String, Integer>();

subsystemCANIDs.put("Elevator", 5);
subsystemCANIDs.put("Intake", 12);

System.out.println(subsystemCANIDs.get("Elevator")); // Prints 5
MethodDescription
put(key, value)Adds a key-value pair, or updates an existing key
get(key)Returns the value associated with the key
containsKey(key)Returns true if the map contains the key
remove(key)Removes the key-value pair associated with the key

Every key in a HashMap must be unique. Calling put() with a key that already exists overwrites its previous value rather than adding a duplicate entry.

HashSet

A HashSet is similar to a HashMap, but it only stores values, no keys, and every value is guaranteed to be unique. It's useful whenever you need to keep track of a collection of items and quickly check whether something has already been seen.

import java.util.HashSet;

HashSet<Integer> scoutedTeamNumbers = new HashSet<Integer>();

scoutedTeamNumbers.add(190);
scoutedTeamNumbers.add(190); // Ignored, 190 is already in the set

System.out.println(scoutedTeamNumbers.size()); // Prints 1
System.out.println(scoutedTeamNumbers.contains(190)); // Prints true

Unlike a List, a HashSet doesn't preserve the order elements were added in, and doesn't allow you to access an element by index.

Why Hashing Is Fast

Both HashMap and HashSet get their name (and their speed) from hashing. When you add a key (or a value, for a HashSet), Java runs it through a hash function that converts it into a number, which determines exactly where in memory that entry gets stored. This means that looking something up doesn't require checking every single element like a List would, Java can jump almost directly to where the entry lives. This is what makes containsKey() and get() so much faster than searching through a List for the same information.