Java.Collections.Why can’t I use byte[] as a key in a HashMap?

Using 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.

🚫 Why byte[] doesn’t work as a HashMap key:

1. Default equals() is identity-based

When 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.

2. HashMap uses 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.


✅ Correct way to use byte arrays as keys:

Option 1: Use java.util.Arrays helpers

Map<List<Byte>, String> map = new HashMap<>();
map.put(Arrays.asList((byte)1, (byte)2), "value");

List<Byte> implements proper equals() and hashCode().

Or, for more performance:

Option 2: Wrap in a custom class

class ByteArrayKey {
    private final byte[] data;

    public ByteArrayKey(byte[] data) {
        this.data = data;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof ByteArrayKey)) return false;
        ByteArrayKey other = (ByteArrayKey) o;
        return Arrays.equals(this.data, other.data);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(data);
    }
}

Now you can do:

Map<ByteArrayKey, String> map = new HashMap<>();
map.put(new ByteArrayKey(new byte[]{1, 2, 3}), "value");

TL;DR

You can’t use byte[] directly as a HashMap key because:

  • It uses reference equality (==) instead of content equality.
  • It doesn’t override hashCode() and equals().

➡️ Wrap it, or use a content-aware structure like List<Byte> or a custom class.

This entry was posted in Без рубрики. Bookmark the permalink.