为什么==和.equals都不能在Java中使用字节数组?
为什么==不能在Java中使用字节数组 例如:为什么==和.equals都不能在Java中使用字节数组?,java,arrays,Java,Arrays,为什么==不能在Java中使用字节数组 例如: byte[] a = new byte[]{1,2,3,4}; byte[] b = new byte[]{1,2,3,4}; a == b //false a.equals(b) //false Arrays.equals(a,b) //true =和字节[]实现等于使用链接比较。在这种情况下,链接指向内存中的不同区域。如果您遵循等于字节[]实现的源代码,您将看到以下内容: public boolean
byte[] a = new byte[]{1,2,3,4};
byte[] b = new byte[]{1,2,3,4};
a == b //false
a.equals(b) //false
Arrays.equals(a,b) //true
=
和字节[]
实现等于使用链接比较。在这种情况下,链接指向内存中的不同区域。如果您遵循等于字节[]
实现的源代码,您将看到以下内容:
public boolean equals(Object obj) {
return (this == obj);
}
这实际上是Object
数组。equals(a,b)
使用数组内容的比较
另外,请参见以下内容,在java中,数组被视为对象。因此,==
将只比较引用。另外a.equals(b)
与a==b
相同,作为对象类中的默认实现,请仅检查引用
如果您确实希望比较内容,则应使用数组.equals(a,b)
。虽然这在多维数组中不起作用
如果您执行以下操作,结果将为true,因为两者都引用相同的引用
b = a;
System.out.println(a==b);
就像equals
比较它们是否共享相同的内存区域一样简单,并且数组。equals
比较数组的内容。变量a和b位于不同的内存位置。
如果打印a和b,它将使用不同的哈希代码打印
因此a==b和a.equals(b)给出false
在java源代码中,方法代码如下
public boolean equals(Object obj) {
return (this == obj);
}
因此equals就像您正在测试的==一样。
如果你想用equals方法得到一个有意义的完整答案,你必须自己重写它
Arrays.equals方法如下所示
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;
}
公共静态布尔等于(字节[]a,字节[]a2){
如果(a==a2)
返回true;
如果(a==null | | a2==null)
返回false;
int length=a.length;
如果(a2.长度!=长度)
返回false;
对于(inti=0;ia.equals(b)
只需使用Object.equals()
(byte[]是一个对象,不重写方法equals()),请参阅源代码:
public boolean equals(Object obj) {
return (this == obj);
}
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;
}
<代码>=比较引用的地址。(不考虑特殊类型:字符串、int等)
Arrays.equals()比较引用的地址和内容,请参阅源代码:
public boolean equals(Object obj) {
return (this == obj);
}
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;
}
公共静态布尔等于(字节[]a,字节[]a2){
如果(a==a2)
返回true;
如果(a==null | | a2==null)
返回false;
int length=a.length;
如果(a2.长度!=长度)
返回false;
对于(int i=0;ibecause==
比较引用而不是内容(至少对于对象,数组被视为一个)。请参见以下内容:-数组不覆盖的equals()
的默认实现也使用=
。@KevinEsche它不回答a.equals(b)//错误
但是。当比较数组时,与常规对象相比,Java语言做了一些违反直觉的事情。.equals
在幕后做了一个=
。@KevinCruijssen问题的原始标题并没有问这个问题。“如果你按照源代码来实现字节的equals,你会看到…”不,至少你是说字节[]
。