Verwenden eines Byte-Arrays als Map-Schlüssel
Sehen Sie irgendwelche problem mit der Verwendung eines byte-array als Map-key? Ich konnte auch new String(byte[])
- und hash durch String
aber es ist einfacher zu verwenden byte[]
.
InformationsquelleAutor der Frage shikhar | 2009-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass
byte[]
verwendet die Objekt-id fürequals
undhashCode
, so dassnicht entsprechen, werden in einer
HashMap
. Ich sehe drei Optionen:String
, aber dann müssen Sie vorsichtig sein, über die encoding-Probleme (Sie brauchen, um sich zu vergewissern, dass die byte -> Zeichenfolge> byte gibt Ihnen die gleichen bytes).List<Byte>
(kann teuer werden im Speicher).hashCode
undequals
auf den Inhalt des byte array.InformationsquelleAutor der Antwort Kathy Van Stone
Es ist okay, so lange Sie nur wollen, Referenz-Gleichheit für Ihre Schlüssel - arrays nicht implementieren-Wert "Gleichheit" in der Weise, würden Sie wahrscheinlich wollen. Zum Beispiel:
gibt etwas aus wie:
(Die tatsächlichen zahlen sind irrelevant; die Tatsache, dass Sie sich unterscheiden, ist wichtig.)
Vorausgesetzt, Sie eigentlich wollen Gleichberechtigung, ich schlage vor, Sie erstellen Ihre eigenen wrapper enthält eine
byte[]
und implementiert, Gleichheit und hash-code-Generierung entsprechend:Beachten Sie, dass wenn Sie ändern die Werte in der byte-array-nach der Verwendung der
ByteArrayWrapper
, wie ein Schlüssel in einHashMap
(etc), wirst du Probleme haben, suchen Sie den Schlüssel wieder... Sie könnten sich eine Kopie der Daten in derByteArrayWrapper
Konstruktor, wenn Sie wollen, aber offensichtlich wird ein Abfall der Leistung, wenn Sie wissen, dass Sie nicht ändern Sie den Inhalt des byte array.EDIT: Wie erwähnt in den Kommentaren, können Sie auch
ByteBuffer
für diese (insbesondere dieByteBuffer#wrap(byte[])
- Methode). Ich weiß nicht, ob es wirklich das richtige, da alle zusätzlichen Fähigkeiten, dieByteBuffer
s haben, die Sie nicht benötigen, aber es ist eine option.InformationsquelleAutor der Antwort Jon Skeet
Wir können ByteBuffer für diese (im Prinzip ist Dies das byte[] wrapper mit einem Komparator)
drucken
InformationsquelleAutor der Antwort byte_array
Könnten Sie
java.math.BigInteger
. Es hat eineBigInteger(byte[] val)
Konstruktor. Es ist ein Referenz-Typ, also könnte es verwendet werden als Schlüssel für die Hashtabelle. Und.equals()
und.hashCode()
definiert sind wie für die jeweiligen integer-zahlen, was bedeutet, BigInteger gleichbleibende entspricht der Semantik als byte [] - array.InformationsquelleAutor der Antwort Artem Oboturov
Ich bin sehr überrascht, dass die Antworten nicht darauf hingewiesen das die meisten einfache alternative.
Ja, es ist nicht möglich, mit Hilfe einer HashMap, aber niemand verhindert, dass Sie mit einer SortedMap als alternative. Die einzige Sache ist, zu schreiben, ein Komparator, die Bedürfnisse, vergleichen die arrays. Es ist nicht so performant wie eine HashMap, aber wenn Sie möchten, eine einfache alternative, hier gehen Sie (Sie können ersetzen SortedMap mit Karte, wenn Sie ausblenden möchten der Umsetzung):
Diese Umsetzung kann angepasst werden, für andere arrays, die einzige Sache, die Sie müssen sich bewusst sein, dass gleich arrays (= gleicher Länge mit gleichberechtigten Mitgliedern) muss 0 zurückgeben, und dass Sie eine determistic um
InformationsquelleAutor der Antwort Thorsten S.
Ich glaube, dass arrays in Java nicht unbedingt implementieren, die
hashCode()
undequals(Object)
Methoden intuitiv. Das heißt, zwei identische byte-arrays wird nicht unbedingt teilen den gleichen hash-code und Sie werden nicht unbedingt behaupten, gleich zu sein. Ohne diese beiden Eigenschaften, Ihr HashMap verhält sich unerwartet.Daher empfehle ich gegen mit
byte[]
als Schlüssel in einer HashMap.InformationsquelleAutor der Antwort Adam Paynter
Sollten Sie verwenden, erstellen Sie eine Klasse so etwas wie ByteArrKey und überlastung hashcode und gleiche Methoden, denken Sie daran, den Vertrag zwischen Ihnen.
Dadurch erhalten Sie mehr Flexibilität, wie können Sie überspringen 0 Einträge werden an das Ende des byte-array, speziell wenn Sie nur einen Teil der form der anderen byte-Puffer.
Diese Weise werden Sie entscheiden, wie beide Objekte, gleich sein SOLLTE.
InformationsquelleAutor der Antwort Milind Patil
Sehe ich Probleme, da sollte man Arrays verwenden.gleich und Array.hashCode, der statt des Standard-array-Implementierungen
InformationsquelleAutor der Antwort dfa
Arrays.toString(bytes)
InformationsquelleAutor der Antwort df.
Könnte man auch konvertieren byte [], um eine 'sichere' string mit Base32-oder Base64, zum Beispiel:
natürlich gibt es viele Varianten der oben genannten, wie:
InformationsquelleAutor der Antwort Christof R
Hier ist eine Lösung, bei der TreeMap, Comparator interface und die java-Methode java.util.Arrays.equals(byte[], byte[]);
HINWEIS: Die Reihenfolge, in der Karte ist nicht relevant, die mit dieser Methode
InformationsquelleAutor der Antwort matdev