bagaimana membandingkan array [] Java Byte?


93
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 ??


kemungkinan duplikat dari Bandingkan dua Byte Array? (Java)
Vadzim

Arrays.equals berfungsi. Jalankan dan periksa online di sini onecompiler.com/java/3wc4ec2su
karthikdivi

Jawaban:


193

Gunakan Arrays.equals()jika Anda ingin membandingkan konten larik sebenarnya yang berisi nilai tipe primitif (seperti byte).

System.out.println(Arrays.equals(aa, bb));

Gunakan Arrays.deepEqualsuntuk perbandingan larik yang berisi objek.


jika saya memiliki 'HashMap <byte [], IoBuffer>' dan saya 'put (a, buffer)' ,,, jika saya 'print (map.containsKey (b))' mencetak "false", apakah sama alasan????
Malas

3
@ Lazy: Ya, alasannya sama ... Anda tidak dapat menggunakan byte mentah [] sebagai kunci di peta ... Baca selengkapnya di sini: stackoverflow.com/questions/1058149/…
Lukasz

6

Penyebabnya tidak sama, yaitu: mereka adalah array yang berbeda dengan elemen yang sama di dalamnya.

Coba gunakan Arrays.equals()atau Arrays.deepEquals().


Itu bagian dari omong kosong Java: Mengapa menggunakan metode statis dari kelas yang berbeda untuk membandingkan objek di kelas lain? Yaitu: Mengapa mereka tidak mengganti equals()metode ini?
U. Windl

3

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. ;)



1

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(...)dan hashcode(...)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 penggunaan equals(...)dan hashCode(...)metode yang bersih.


0

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);

0

Anda juga dapat menggunakan a ByteArrayComparatordari Apache Directory . Selain sama, ini memungkinkan Anda membandingkan jika satu array lebih besar dari yang lain.


0

Coba ini:

boolean blnResult = Arrays.equals(byteArray1, byteArray2);

Saya juga tidak yakin tentang ini, tetapi coba ini mungkin berhasil.


0

mengapa a [] tidak sama dengan b []? Karena equalsfungsi benar-benar dipanggil Byte[]atau byte[]ada Object.equals(Object obj). Fungsi ini hanya membandingkan identifikasi objek, tidak membandingkan konten larik.


0

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.

.


0

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;
    }

0

Karena tidak ==maupun equals()metode array membandingkan isi; keduanya hanya mengevaluasi identitas objek ( ==selalu dilakukan, dan equals()tidak ditimpa, sehingga versi dari Objectdigunakan).

Untuk membandingkan isinya, gunakan Arrays.equals().



0

Arrays.equalstidak cukup untuk pembanding, Anda tidak dapat memeriksa peta berisi data. Saya menyalin kode dari Arrays.equals, dimodifikasi untuk membuat file Comparator.

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;
        }
    }
}

-4

Ada cara yang lebih cepat untuk melakukannya:

Arrays.hashCode(arr1) == Arrays.hashCode(arr2)

2
Yang dimaksud dengan "lebih cepat" adalah "lebih lambat".
divegeek
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.