💡 The constructor:
new HashMap(int initialCapacity, float loadFactor)
is one of the most powerful and fine-tuned ways to create a HashMap. Let’s break down what each parameter means:
💡 The constructor:
new HashMap(int initialCapacity, float loadFactor)
is one of the most powerful and fine-tuned ways to create a HashMap. Let’s break down what each parameter means:
Excellent question, Stanley! Let’s break it down:
How many new objects are created when you do
map.put(key, value)in a HashMap?
It depends on a few factors like resizing, collisions, and whether the key already exists. But in the most common case, here’s what happens:
Continue readingWe’ll define a transition as a significant operation or decision point the HashMap makes to retrieve a value. This includes hashing, indexing, and comparisons.
If
HashMapconverts a bucket’s linked list to a red-black tree, how can that work when keys don’t necessarily implementComparable?
After all, a red-black tree needs to order keys to compare them — so how does that not break?
Continue readingThe worst-case runtime of
get(key)when the key is in the map is:
It depends on the internal structure of the HashMap and how collisions are handled.
Continue readinghashCode() values?In Java, the return type of hashCode() is an int, so:
public int hashCode()
That means:
The methods equals() and hashCode() play a critical role in how HashMap works under the hood.
Let’s break it down with a clear and intuitive explanation. 🧠
When you do:
map.put(key, value);
Step 1: Use hashCode() to find the bucket index
int hash = key.hashCode();
int index = hash % table.length;
➡️ This determines which bucket (array slot) the entry goes into.
Continue readingUsing byte[] as a key in a HashMapdoesn’t work the way you might expect — and it’s all because of how arrays handle equals() and hashCode() in Java.
byte[] doesn’t work as a HashMap key:equals() is identity-basedWhen you use byte[] as a key, it inherits equals() from Object:
byte[] a = {1, 2, 3};
byte[] b = {1, 2, 3};
System.out.println(a.equals(b)); // false ❌
Even though the contents are the same, the two arrays are different objects, so:
equals() returns false,hashCode() is based on memory address, not content.equals() and hashCode()So when you do:
map.put(a, "value");
map.get(b); // returns null ❌
It doesn’t find b even though it “looks” like a, because the keys are not considered equal.
equals() and hashCode() implementationIf you create your own key class and don’t override equals() and hashCode() properly, HashMap won’t be able to:
class MyKey {
int id;
MyKey(int id) { this.id = id; }
// Oops! No hashCode() or equals()
}
Map<MyKey, String> map = new HashMap<>();
map.put(new MyKey(1), "A");
map.put(new MyKey(1), "B");
System.out.println(map.size()); // Output: 2 (should be 1)
➡️ Both keys look logically equal but go to different buckets, so the first value becomes unreachable — effectively “lost”.
Continue reading