Java Byte[] 어레이 비교 방법
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 Byte Array"를 실행하면 "false false false"라는 답이 나옵니다.
a [ ]는 b [ ]라고 생각합니다만, JVM은 내가 틀렸다고 합니다.왜요?
사용하다Arrays.equals()
기본 유형 값(예: 바이트)을 포함하는 배열의 실제 내용을 비교하려면 다음과 같이 하십시오.
System.out.println(Arrays.equals(aa, bb));
사용하다Arrays.deepEquals
개체를 포함하는 어레이를 비교합니다.
동일하지 않기 때문에, 즉, 내부에 동일한 요소가 있는 다른 어레이입니다.
사용해보십시오.Arrays.equals()
또는Arrays.deepEquals()
.
바이트[]는 가변이므로 존재만으로 취급됩니다..equals()
같은 물체일 경우.
당신이 사용해야 할 콘텐츠를 비교하고 싶다면Arrays.equals(a, b)
BTW: 그건 내가 설계한 방식이 아니야.;)
당신은 봤나요?
편집: 코멘트대로 바이트 배열을 HashMap 키로 사용하는 문제가 있는 경우 다음 질문을 참조하십시오.
어레이를 일반적인 HashMap 키로 사용하려고 하면 작동하지 않습니다.어레이를 보유하는 커스텀 래퍼 오브젝트를 생성하여equals(...)
그리고.hashcode(...)
method는 java.disples에서 결과를 반환합니다.어레이 방식예를 들면...
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(...)
방법들.
가치평등이 아닌 오브젝트 ID를 테스트하고 있기 때문에 false가 반환됩니다.어레이가 실제로 메모리 내의 다른 개체이기 때문에 false가 반환됩니다.
값의 동일성을 테스트하려면 java.util의 편리한 비교 함수를 사용해야 합니다.어레이
예.
import java.util.Arrays;
'''''
Arrays.equals(a,b);
를 사용할 수도 있습니다.ByteArrayComparator
Apache 디렉토리에서.동일할 뿐만 아니라 하나의 배열이 다른 배열보다 큰지 비교할 수 있습니다.
다음을 시도해 보십시오.
boolean blnResult = Arrays.equals(byteArray1, byteArray2);
저도 잘 모르겠습니다만, 혹시 효과가 있을지도 모릅니다.
a[]가 b[]와 같지 않은 이유왜냐면equals
정말로 요구되는 기능Byte[]
또는byte[]
이Object.equals(Object obj)
이 함수는 객체 식별만 비교하며 배열 내용은 비교하지 않습니다.
guava TreeRangeMap과 동등한 어레이 래퍼를 찾고 있습니다.그 클래스는 비교기를 받지 않는다.
조사 결과, JDK의 ByteBuffer가 이 기능을 가지고 있어 원래의 어레이를 복사하지 않는 것을 알 수 있었습니다.자세한 내용은 ByteBuffer::asLongBuffer 8바이트(복사되지 않음)와 빠르게 비교할 수 있습니다.디폴트로는 ByteBuffer::wrap(byte[])은 BigEndian을 사용하기 때문에 순서 관계는 개별 바이트를 비교하는 것과 동일합니다.
.
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;
}
다 안 되니까==
equals()
둘 다합니다.아이디==
, 「」는 「」입니다.equals()
되지 않기 에, 「」의 「」은 「」로부터 덮어쓰기 되지 .Object
가 사용되고 있습니다).
내용을 비교하려면 을 사용하십시오.
org.apache.commons.lang도 사용할 수 있습니다.Array Utils.isEquals()
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;
}
}
}
이를 위한 더 빠른 방법이 있습니다.
Arrays.hashCode(arr1) == Arrays.hashCode(arr2)
언급URL : https://stackoverflow.com/questions/9499560/how-to-compare-the-java-byte-array
'it-source' 카테고리의 다른 글
C/C++로 DLL을 컴파일하여 다른 프로그램에서 호출합니다. (0) | 2023.01.13 |
---|---|
Intelij IDEA가 크래쉬하여 오류가 발생하였습니다. (0) | 2023.01.13 |
Python 집합과 목록 (0) | 2023.01.13 |
개체 목록에 대한 vuex 저장소를 구성하고 ID를 기반으로 개체 목록에 개별적으로 매핑하는 방법 (0) | 2023.01.13 |
여러 요소를 배열에 푸시 (0) | 2023.01.13 |