jak porównać tablicę 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));
    }
}

Nie wiem, dlaczego wszystkie z nich drukują fałszywe.

Kiedy uruchamiam „java ByteArray”, odpowiedź brzmi „false false false false”.

Myślę, że a [] równa się b [], ale JVM mówi mi, że się mylę, dlaczego ??



Arrays.equals działa. Uruchom i sprawdź online tutaj onecompiler.com/java/3wc4ec2su
karthikdivi

Odpowiedzi:


193

Użyj, Arrays.equals()jeśli chcesz porównać rzeczywistą zawartość tablic, które zawierają wartości typów pierwotnych (np. Bajt).

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

Służy Arrays.deepEqualsdo porównywania tablic zawierających obiekty.


jeśli mam 'HashMap <byte [], IoBuffer>' i 'put (a, buffer)' ,,, if i 'print (map.containsKey (b))' wypisuje "false", czy to to samo powód????
Leniwy

3
@Lazy: Tak, powód jest ten sam ... nie możesz używać surowego bajtu [] jako kluczy w mapach ... Przeczytaj więcej tutaj: stackoverflow.com/questions/1058149/ ...
Łukasz

6

Bo nie są równe, tj .: są różnymi tablicami z równymi elementami w środku.

Spróbuj użyć Arrays.equals()lub Arrays.deepEquals().


To część nonsensu języka Java: po co używać metody statycznej z innej klasy do porównywania obiektów w innej klasie? To znaczy: dlaczego nie zastąpili equals()metody?
U. Windl

3

Ponieważ bajt [] jest zmienny, jest traktowany jako byt tylko .equals()wtedy , gdy jest tym samym obiektem.

Jeśli chcesz porównać zawartość, której musisz użyć Arrays.equals(a, b)

BTW: To nie jest sposób, w jaki bym to zaprojektował. ;)



1

Jeśli próbujesz użyć tablicy jako ogólnego klucza HashMap, to nie zadziała. Rozważ utworzenie niestandardowego obiektu opakowującego, który przechowuje tablicę i którego metoda equals(...)i hashcode(...)zwraca wyniki z metod java.util.Arrays. Na przykład...

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


}

Obiekty tej klasy opakowania będą działały dobrze jako klucz dla Ciebie HashMap<MyByteArray, OtherType>i pozwolą na czyste użycie metod equals(...)i hashCode(...).


0

Zwracają fałsz, ponieważ testujesz pod kątem tożsamości obiektu, a nie równości wartości. Zwraca to fałsz, ponieważ tablice są w rzeczywistości różnymi obiektami w pamięci.

Jeśli chcesz przetestować równość wartości, użyj przydatnych funkcji porównawczych w java.util.Arrays

na przykład

import java.util.Arrays;

'''''

Arrays.equals(a,b);

0

Możesz także użyć pliku ByteArrayComparatorz katalogu Apache . Oprócz równości pozwala porównać, czy jedna tablica jest większa od drugiej.


0

Spróbuj tego:

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

Tego też nie jestem pewien, ale spróbuj to może zadziała.


0

dlaczego a [] nie równa się b []? Ponieważ equalsfunkcja naprawdę jest wywoływana Byte[]lub byte[]jest Object.equals(Object obj). Ta funkcja porównuje tylko identyfikację obiektu, nie porównuje zawartości tablicy.


0

Szukałem opakowania tablicy, które byłoby porównywalne do użycia z TreeRangeMap guawy. Klasa nie akceptuje komparatora.

Po kilku badaniach zdałem sobie sprawę, że ByteBuffer z JDK ma tę funkcję i nie kopiuje oryginalnej tablicy, co jest dobre. Co więcej, możesz szybciej porównywać z ByteBuffer :: asLongBuffer 8 bajtów na raz (również nie kopiuje). Domyślnie ByteBuffer :: wrap (byte []) używa BigEndian, więc relacja kolejności jest taka sama, jak porównywanie pojedynczych bajtów.

.


0

Porównanie bajtów 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

Ponieważ ==ani equals()metoda tablicy nie porównuje zawartości; oba oceniają tylko tożsamość obiektu ( ==zawsze tak robią i equals()nie są nadpisywane, więc Objectużywana jest wersja z ).

Aby porównać zawartość, użyj Arrays.equals().



0

Arrays.equalsto za mało dla komparatora, nie można sprawdzić, czy mapa zawiera dane. Kopiuję kod z Arrays.equals, zmodyfikowany do kompilacji 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

Jest na to szybszy sposób:

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

2
Przez „szybciej” masz na myśli „wolniej”.
divegeek
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.