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));
}
}
Saya tidak tahu mengapa semuanya dicetak palsu.
Ketika saya menjalankan "java ByteArray", jawabannya adalah "false false false false".
Saya pikir a [] sama dengan b [] tetapi JVM memberi tahu saya bahwa saya salah, mengapa ??
Jawaban:
Gunakan
Arrays.equals()
jika Anda ingin membandingkan konten larik sebenarnya yang berisi nilai tipe primitif (seperti byte).Gunakan
Arrays.deepEquals
untuk perbandingan larik yang berisi objek.sumber
Penyebabnya tidak sama, yaitu: mereka adalah array yang berbeda dengan elemen yang sama di dalamnya.
Coba gunakan
Arrays.equals()
atauArrays.deepEquals()
.sumber
equals()
metode ini?Karena byte [] bisa berubah itu diperlakukan sebagai hanya
.equals()
jika objek yang sama.Jika Anda ingin membandingkan konten yang harus Anda gunakan
Arrays.equals(a, b)
BTW: Ini bukan cara saya mendesainnya. ;)
sumber
sudahkah kamu melihat
Arrays.equals()
?Edit: jika, sesuai komentar Anda, masalah menggunakan array byte sebagai kunci HashMap, lihat pertanyaan ini .
sumber
Jika Anda mencoba menggunakan array sebagai kunci HashMap umum, itu tidak akan berhasil. Pertimbangkan untuk membuat custom objek pembungkus yang memegang array, dan yang
equals(...)
danhashcode(...)
metode mengembalikan hasil dari metode java.util.Arrays. Sebagai contoh...import java.util.Arrays; public class MyByteArray { private byte[] data; // ... constructors, getters methods, setter methods, etc... @Override public int hashCode() { return Arrays.hashCode(data); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MyByteArray other = (MyByteArray) obj; if (!Arrays.equals(data, other.data)) return false; return true; } }
Objek dari kelas pembungkus ini akan berfungsi dengan baik sebagai kunci untuk Anda
HashMap<MyByteArray, OtherType>
dan akan memungkinkan penggunaanequals(...)
danhashCode(...)
metode yang bersih.sumber
Mereka mengembalikan false karena Anda menguji identitas objek daripada persamaan nilai. Ini mengembalikan false karena array Anda sebenarnya adalah objek yang berbeda dalam memori.
Jika Anda ingin menguji persamaan nilai harus menggunakan fungsi perbandingan praktis di java.util.Arrays
misalnya
import java.util.Arrays; ''''' Arrays.equals(a,b);
sumber
Anda juga dapat menggunakan a
ByteArrayComparator
dari Apache Directory . Selain sama, ini memungkinkan Anda membandingkan jika satu array lebih besar dari yang lain.sumber
Coba ini:
boolean blnResult = Arrays.equals(byteArray1, byteArray2);
Saya juga tidak yakin tentang ini, tetapi coba ini mungkin berhasil.
sumber
mengapa a [] tidak sama dengan b []? Karena
equals
fungsi benar-benar dipanggilByte[]
ataubyte[]
adaObject.equals(Object obj)
. Fungsi ini hanya membandingkan identifikasi objek, tidak membandingkan konten larik.sumber
Saya mencari pembungkus array yang membuatnya sebanding untuk digunakan dengan jambu TreeRangeMap. Kelas tidak menerima pembanding.
Setelah beberapa penelitian saya menyadari bahwa ByteBuffer dari JDK memiliki fitur ini dan tidak menyalin array asli yang bagus. Lebih dari itu Anda dapat membandingkan lebih cepat dengan ByteBuffer :: asLongBuffer 8 byte pada waktu (juga tidak menyalin). Secara default ByteBuffer :: wrap (byte []) menggunakan BigEndian sehingga relasi urutannya sama dengan membandingkan byte individu.
.
sumber
Perbandingan byte Java,
public static boolean equals(byte[] a, byte[] a2) { if (a == a2) return true; if (a == null || a2 == null) return false; int length = a.length; if (a2.length != length) return false; for (int i = 0; i < length; i++) if (a[i] != a2[i]) return false; return true; }
sumber
Karena tidak
==
maupunequals()
metode array membandingkan isi; keduanya hanya mengevaluasi identitas objek (==
selalu dilakukan, danequals()
tidak ditimpa, sehingga versi dariObject
digunakan).Untuk membandingkan isinya, gunakan
Arrays.equals()
.sumber
Anda juga dapat menggunakan org.apache.commons.lang.ArrayUtils.isEquals ()
sumber
Arrays.equals
tidak cukup untuk pembanding, Anda tidak dapat memeriksa peta berisi data. Saya menyalin kode dariArrays.equals
, dimodifikasi untuk membuat fileComparator
.class ByteArrays{ public static <T> SortedMap<byte[], T> newByteArrayMap() { return new TreeMap<>(new ByteArrayComparator()); } public static SortedSet<byte[]> newByteArraySet() { return new TreeSet<>(new ByteArrayComparator()); } static class ByteArrayComparator implements Comparator<byte[]> { @Override public int compare(byte[] a, byte[] b) { if (a == b) { return 0; } if (a == null || b == null) { throw new NullPointerException(); } int length = a.length; int cmp; if ((cmp = Integer.compare(length, b.length)) != 0) { return cmp; } for (int i = 0; i < length; i++) { if ((cmp = Byte.compare(a[i], b[i])) != 0) { return cmp; } } return 0; } } }
sumber
Ada cara yang lebih cepat untuk melakukannya:
sumber