Do you see any problem with using a byte array as Map key? I could also do new String(byte[]) and hash by String but it is more straightforward to use byte[].
It will have to be the same object. A HashMap compares keys using equals() and two arrays in Java are equal only if they are the same object.
You cannot do it this way. Both t and a will have different hashCode() values because the the java. lang. Array.
You can't use a Map as a key but you can use it as a value. To explain further, since you are likely to be adding to the HashMap the key will not remain constant and thus will no longer serve it's purpose as a key. You can have a Map as key but as you pointed out since a Map is (typically) mutable the key changes.
In a HashMap, keys and values can be added using the HashMap. put() method. We can also convert two arrays containing keys and values into a HashMap with respective keys and values.
It's okay so long as you only want reference equality for your key - arrays don't implement "value equality" in the way that you'd probably want. For example:
byte[] array1 = new byte[1]; byte[] array2 = new byte[1];  System.out.println(array1.equals(array2)); System.out.println(array1.hashCode()); System.out.println(array2.hashCode());   prints something like:
false 1671711 11394033   (The actual numbers are irrelevant; the fact that they're different is important.)
Assuming you actually want equality, I suggest you create your own wrapper which contains a byte[] and implements equality and hash code generation appropriately:
public final class ByteArrayWrapper {     private final byte[] data;      public ByteArrayWrapper(byte[] data)     {         if (data == null)         {             throw new NullPointerException();         }         this.data = data;     }      @Override     public boolean equals(Object other)     {         if (!(other instanceof ByteArrayWrapper))         {             return false;         }         return Arrays.equals(data, ((ByteArrayWrapper)other).data);     }      @Override     public int hashCode()     {         return Arrays.hashCode(data);     } }   Note that if you change the values within the byte array after using the ByteArrayWrapper, as a key in a HashMap (etc) you'll have problems looking up the key again... you could take a copy of the data in the ByteArrayWrapper constructor if you want, but obviously that will be a waste of performance if you know you won't be changing the contents of the byte array.
EDIT: As mentioned in the comments, you could also use ByteBuffer for this (in particular, its ByteBuffer#wrap(byte[]) method). I don't know whether it's really the right thing, given all the extra abilities that ByteBuffers have which you don't need, but it's an option.
The problem is that byte[] uses object identity for equals and hashCode, so that 
byte[] b1 = {1, 2, 3} byte[] b2 = {1, 2, 3}   will not match in a HashMap.  I see three options:
String, but then you have to be careful about encoding issues (you need to make certain that the byte -> String -> byte gives you the same bytes).List<Byte> (can be expensive in memory).hashCode and equals to use the contents of the byte array.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With