làm thế nào để so sánh mảng Java Byte []?


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

Tôi không biết tại sao tất cả chúng đều in sai.

Khi tôi chạy "java ByteArray", câu trả lời là "false false false false".

Tôi nghĩ a [] bằng b [] nhưng JVM đang nói với tôi rằng tôi sai, tại sao ??


bản sao có thể có của So sánh hai Mảng Byte? (Java)
Vadzim

Câu trả lời:


191

Sử dụng Arrays.equals()nếu bạn muốn so sánh nội dung thực tế của các mảng có chứa các giá trị kiểu nguyên thủy (như byte).

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

Sử dụng Arrays.deepEqualsđể so sánh các mảng có chứa các đối tượng.


nếu tôi có 'HashMap <byte [], IoBuffer>' và tôi 'put (a, buffer)' ,,, nếu tôi 'print (map.containsKey (b))' thì nó in ra "false", có giống nhau không lý do ????
Lười biếng

3
@Lazy: Vâng, lý do là giống nhau ... bạn không thể sử dụng byte thô [] làm khóa trong bản đồ ... Đọc thêm tại đây: stackoverflow.com/questions/1058149/…
Lukasz

6

Vì chúng không bằng nhau, tức là: chúng là các mảng khác nhau với các phần tử bằng nhau bên trong.

Hãy thử sử dụng Arrays.equals()hoặc Arrays.deepEquals().


Đó là một phần vô lý của Java: Tại sao lại sử dụng một phương thức tĩnh từ một lớp khác để so sánh các đối tượng trong một lớp khác? Đó là: Tại sao họ không ghi đè equals()phương thức?
U. Windl

3

Vì byte [] có thể thay đổi, nó được coi là duy nhất .equals()nếu nó là cùng một đối tượng.

Nếu bạn muốn so sánh các nội dung bạn phải sử dụng Arrays.equals(a, b)

BTW: Đó không phải là cách tôi thiết kế. ;)



1

Nếu bạn đang cố gắng sử dụng mảng như một khóa HashMap chung, điều đó sẽ không hoạt động. Hãy xem xét việc tạo một đối tượng trình bao bọc tùy chỉnh chứa mảng equals(...)hashcode(...)phương thức và của nó trả về kết quả từ các phương thức java.util.Arrays. Ví dụ...

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


}

Các đối tượng của lớp trình bao bọc này sẽ hoạt động tốt như một khóa cho bạn HashMap<MyByteArray, OtherType>và sẽ cho phép sử dụng sạch các phương thức equals(...)hashCode(...).


0

Chúng trả về false bởi vì bạn đang kiểm tra danh tính đối tượng hơn là bình đẳng giá trị. Điều này trả về false vì các mảng của bạn thực sự là các đối tượng khác nhau trong bộ nhớ.

Nếu bạn muốn kiểm tra sự bình đẳng giá trị, hãy sử dụng các hàm so sánh tiện dụng trong java.util.

ví dụ

import java.util.Arrays;

'''''

Arrays.equals(a,b);

0

Bạn cũng có thể sử dụng một ByteArrayComparatortừ Thư mục Apache . Ngoài bằng, nó cho phép bạn so sánh nếu một mảng lớn hơn mảng kia.


0

Hãy thử cho điều này:

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

Tôi cũng không chắc chắn về điều này, nhưng hãy thử điều này có thể nó hoạt động.


0

tại sao a [] không bằng b []? Bởi vì equalshàm thực sự được gọi trên Byte[]hoặc byte[]Object.equals(Object obj). Hàm này chỉ so sánh nhận dạng đối tượng, không so sánh nội dung của mảng.


0

Tôi đã tìm kiếm một trình bao bọc mảng có thể so sánh nó với việc sử dụng với TreeRangeMap ổi. Lớp không chấp nhận bộ so sánh.

Sau một số nghiên cứu, tôi nhận ra rằng ByteBuffer từ JDK có tính năng này và nó không sao chép mảng ban đầu. Nhiều hơn bạn có thể so sánh nhanh hơn với ByteBuffer :: asLongBuffer 8 byte tại thời điểm (cũng không sao chép). Theo mặc định, ByteBuffer :: wrap (byte []) sử dụng BigEndian nên quan hệ thứ tự giống như so sánh từng byte riêng lẻ.

.


0

So sánh 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

Bởi vì không phải ==cũng không phải là equals()phương pháp của mảng so sánh các nội dung; cả hai đều chỉ đánh giá nhận dạng đối tượng ( ==luôn luôn như vậy và equals()không bị ghi đè, vì vậy phiên bản từObject đang được sử dụng).

Để so sánh các nội dung, sử dụng Arrays.equals().



0

Arrays.equalslà không đủ cho một bộ so sánh, bạn không thể kiểm tra bản đồ chứa dữ liệu. Tôi sao chép mã từ Arrays.equals, sửa đổi để xây dựng một 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

Có một cách nhanh hơn để làm điều đó:

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

2
Bởi "nhanh hơn" có nghĩa là "chậm hơn".
lặn biển
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.