public class ByteArr {
public static void main(String[] args){
Byte[] a = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00};
Byte[] b = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00};
byte[] aa = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00};
byte[] bb = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00};
System.out.println(a);
System.out.println(b);
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println(aa);
System.out.println(bb);
System.out.println(aa == bb);
System.out.println(aa.equals(bb));
}
}
Ich weiß nicht, warum alle falsch drucken.
Wenn ich "java ByteArray" ausführe, lautet die Antwort "false false false false".
Ich denke, das a [] ist gleich b [], aber die JVM sagt mir, dass ich falsch liege, warum ??
Antworten:
Verwenden
Arrays.equals()
Sie diese Option, wenn Sie den tatsächlichen Inhalt von Arrays vergleichen möchten, die Werte für primitive Typen enthalten (z. B. Byte).Verwenden Sie
Arrays.deepEquals
zum Vergleich von Arrays , die Objekte enthalten.quelle
Weil sie nicht gleich sind, dh sie sind verschiedene Arrays mit gleichen Elementen.
Versuchen Sie es mit
Arrays.equals()
oderArrays.deepEquals()
.quelle
equals()
Methode nicht überschrieben ?Da Byte [] veränderbar ist, wird es nur
.equals()
dann als solches behandelt, wenn es dasselbe Objekt ist.Wenn Sie den Inhalt vergleichen möchten, müssen Sie ihn verwenden
Arrays.equals(a, b)
Übrigens: Es ist nicht so, wie ich es entwerfen würde. ;)
quelle
haben Sie sehen
Arrays.equals()
?Bearbeiten: Wenn das Problem gemäß Ihrem Kommentar ein Byte-Array als HashMap-Schlüssel verwendet, wird diese Frage angezeigt .
quelle
Wenn Sie versuchen, das Array als generischen HashMap-Schlüssel zu verwenden, funktioniert dies nicht. Erwägen Sie, ein benutzerdefiniertes Wrapper-Objekt zu erstellen, das das Array enthält und dessen
equals(...)
undhashcode(...)
-Methode die Ergebnisse der Methoden java.util.Arrays zurückgibt. Beispielsweise...Objekte dieser Wrapper-Klasse funktionieren gut als Schlüssel für Ihre
HashMap<MyByteArray, OtherType>
und ermöglichen eine saubere Verwendung vonequals(...)
undhashCode(...)
Methoden.quelle
Sie geben false zurück, weil Sie eher auf Objektidentität als auf Wertgleichheit testen. Dies gibt false zurück, da Ihre Arrays tatsächlich unterschiedliche Objekte im Speicher sind.
Wenn Sie auf Wertgleichheit testen möchten, sollten Sie die praktischen Vergleichsfunktionen in java.util.Arrays verwenden
z.B
quelle
Sie können auch eine Verwendung
ByteArrayComparator
von Apache Directory . Zusätzlich zu gleich können Sie vergleichen, ob ein Array größer als das andere ist.quelle
Versuchen Sie dies:
Ich bin mir auch nicht sicher, aber versuche es, vielleicht funktioniert es.
quelle
warum ist a [] nicht gleich b []? Weil die
equals
Funktion wirklich aufgerufen istByte[]
oderbyte[]
istObject.equals(Object obj)
. Diese Funktion vergleicht nur die Objektidentifikation, nicht den Inhalt des Arrays.quelle
Ich habe nach einem Array-Wrapper gesucht, der die Verwendung mit Guava TreeRangeMap vergleichbar macht. Die Klasse akzeptiert keinen Komparator.
Nach einigen Recherchen wurde mir klar, dass ByteBuffer von JDK diese Funktion hat und das ursprüngliche Array nicht kopiert, was gut ist. Darüber hinaus können Sie mit ByteBuffer :: asLongBuffer 8 Bytes gleichzeitig schneller vergleichen (kopiert auch nicht). Standardmäßig verwendet ByteBuffer :: wrap (byte []) BigEndian, sodass die Ordnungsbeziehung der Vergleich einzelner Bytes entspricht.
.
quelle
Java Byte vergleichen,
quelle
Weil weder
==
noch dieequals()
Methode des Arrays den Inhalt vergleichen; Beide bewerten nur die Objektidentität (==
immer undequals()
nicht überschrieben, daher wird die Version vonObject
verwendet).Verwenden Sie zum Vergleichen des Inhalts
Arrays.equals()
.quelle
Sie können auch org.apache.commons.lang.ArrayUtils.isEquals () verwenden.
quelle
Arrays.equals
reicht für einen Komparator nicht aus, Sie können nicht überprüfen, ob die Karte die Daten enthält. Ich kopiere den Code vonArrays.equals
, geändert, um eine zu erstellenComparator
.quelle
Es gibt einen schnelleren Weg, dies zu tun:
quelle