[英]how to compare the Java Byte[] array?
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告訴我我錯了,為什么?
如果要比較包含基本類型值(如byte)的數組的實際內容,請使用Arrays.equals()
)。
System.out.println(Arrays.equals(aa, bb));
使用Arrays.deepEquals
比較包含對象的數組。
因為它們不相等,即:它們是內部具有相同元素的不同數組。
嘗試使用Arrays.equals()
或Arrays.deepEquals()
。
由於byte []是可變的,如果它是相同的對象,它被視為僅僅是.equals()
。
如果你想比較你必須使用的內容Arrays.equals(a, b)
順便說一句:這不是我設計它的方式。 ;)
你看過Arrays.equals()
嗎?
編輯:如果,根據您的評論,問題是使用字節數組作為HashMap鍵,然后看到這個問題 。
如果您嘗試將該數組用作通用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(...)
方法。
您還可以使用Apache Directory中的ByteArrayComparator
。 除了equals之外,它還可以比較一個數組是否大於另一個數組。
為什么a []不等於b []? 因為實際調用Byte[]
或byte[]
equals
函數是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;
}
你也可以使用org.apache.commons.lang.ArrayUtils.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;
}
}
}
因為數組的==
和equals()
方法都不比較內容; 兩者都只評估對象標識( ==
總是這樣,並且不會覆蓋equals()
,因此正在使用Object
的版本)。
要比較內容,請使用Arrays.equals()
。
它們返回false,因為您正在測試對象標識而不是值相等。 返回false,因為您的數組實際上是內存中的不同對象。
如果要測試值的相等性,請使用java.util.Arrays中的方便比較函數
例如
import java.util.Arrays;
'''''
Arrays.equals(a,b);
試試這個:
boolean blnResult = Arrays.equals(byteArray1, byteArray2);
我也不確定這一點,但嘗試這可能是有效的。
有一種更快的方法:
Arrays.hashCode(arr1) == Arrays.hashCode(arr2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.