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

왜 그들 모두가 거짓으로 인쇄하는지 모르겠습니다.

"java ByteArray"를 실행하면 대답은 "false false false false"입니다.

나는 a []가 b []와 같다고 생각하지만 JVM은 내가 틀렸다고 말하고 있는데, 왜 ??


답변:


193

Arrays.equals()기본 유형 값 (예 : 바이트)을 포함하는 배열의 실제 내용을 비교하려는 경우 사용하십시오 .

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

Arrays.deepEquals객체를 포함하는 배열의 비교에 사용 합니다.


'HashMap <byte [], IoBuffer>'가 있고 'put (a, buffer)',,, 'print (map.containsKey (b))'가 있으면 "false"가 출력됩니다. 이유????
Lazy

3
@Lazy : 예, 이유는 같습니다 ... 원시 byte []를 맵의 키로 사용할 수 없습니다 ... 자세한 내용은 여기를 참조하세요. stackoverflow.com/questions/1058149/…
Lukasz

6

왜냐하면 그것들이 같지 않기 때문입니다. 즉, 내부에 동일한 요소가있는 다른 배열입니다.

Arrays.equals()또는을 사용해보십시오 Arrays.deepEquals().


이것이 자바 말도 안되는 부분입니다. 다른 클래스의 객체를 비교하기 위해 다른 클래스의 정적 메서드를 사용하는 이유는 무엇입니까? 즉, equals()메서드 를 재정의하지 않은 이유는 무엇 입니까?
U. Windl

3

byte []는 변경 가능하므로 .equals()동일한 객체 인 경우 에만있는 것으로 처리됩니다 .

사용해야 할 내용을 비교하고 싶다면 Arrays.equals(a, b)

BTW : 제가 디자인하는 방식이 아닙니다. ;)



1

배열을 일반 HashMap 키로 사용하려는 경우 작동하지 않습니다. 배열을 보유하고 equals(...)hashcode(...)메소드가 java.util.Arrays 메소드의 결과를 리턴 하는 사용자 정의 랩퍼 오브젝트를 작성하는 것을 고려하십시오 . 예를 들면 ...

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


}

이 래퍼 클래스의 개체는 키로 잘 작동 HashMap<MyByteArray, OtherType>하며 equals(...)hashCode(...)메서드 를 깔끔하게 사용할 수 있습니다.


0

값 평등이 아닌 객체 ID를 테스트하기 때문에 거짓을 반환합니다. 배열이 실제로 메모리에서 다른 객체이기 때문에 false를 반환합니다.

값이 같은지 테스트하려면 java.util.Arrays 의 편리한 비교 함수를 사용해야합니다.

예 :

import java.util.Arrays;

'''''

Arrays.equals(a,b);

0

Apache DirectoryByteArrayComparator 에서를 사용할 수도 있습니다 . 같음 외에도 한 배열이 다른 배열 보다 큰지 비교할 수 있습니다 .


0

이것을 시도하십시오 :

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

나도 이것에 대해 잘 모르겠지만 작동 할 수도 있습니다.


0

왜 a []가 b []와 같지 않습니까? 때문에 equals함수가 실제로 호출 Byte[]또는 byte[]이다 Object.equals(Object obj). 이 함수는 객체 식별 만 비교하고 배열의 내용을 비교하지 않습니다.


0

구아바 TreeRangeMap과 함께 사용할 수있는 배열 래퍼를 찾았습니다. 클래스는 비교기를 허용하지 않습니다.

몇 가지 연구 끝에 JDK의 ByteBuffer에이 기능이 있고 원본 배열을 복사하지 않는다는 것을 깨달았습니다. 더 나아가 ByteBuffer :: asLongBuffer 8 바이트 (복사하지 않음)와 더 빠르게 비교할 수 있습니다. 기본적으로 ByteBuffer :: wrap (byte [])는 BigEndian을 사용하므로 순서 관계는 개별 바이트를 비교하는 것과 동일합니다.

.


0

자바 바이트 비교,

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

배열 ==equals()방법 도 내용을 비교 하지 않기 때문입니다 . 둘 다 객체 ID 만 평가합니다 ( ==항상 수행하고 equals()덮어 쓰지 않으므로 버전은Object 이 사용됨).

내용을 비교하려면 Arrays.equals().



0

Arrays.equals비교기에 충분하지 않으면지도에 데이터가 포함되어 있는지 확인할 수 없습니다. 나는의 코드 복사 Arrays.equals를 구축하기 위해 수정을 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

이를 수행하는 더 빠른 방법이 있습니다.

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

2
"빠른"이란 "느린"을 의미합니다.
divegeek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.