为什么==不能在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
答案 0 :(得分:4)
==
和byte[]
实现equals
使用链接比较。在这种情况下,链接指向内存中的不同区域。如果您关注equals
byte[]
实现的源代码,您将看到以下内容:
public boolean equals(Object obj) {
return (this == obj);
}
这实际上是Object
Arrays.equals(a,b)
使用数组内容的比较。
另请参阅以下What is the difference between == vs equals() in Java?
答案 1 :(得分:1)
在java中,数组被视为对象。所以public class ProductService: IProductService
{
readonly ChannelFactory<IProductService> factory;
public ProductService()
{
factory = new ChannelFactory<IProductService>("*");
}
public Product Get(int id)
{
var channel = factory.CreateChannel();
return channel.Get(id);
}
}
只会比较参考文献。同样==
与a.equals(b)
相同,因为Object类中的默认实现只检查引用。
如果您真的希望比较内容,则应使用a==b
。虽然这在多维数组中不起作用。
如果您执行以下操作,则结果为true,因为两者都会引用相同的参考。
Arrays.equals(a,b)
答案 2 :(得分:0)
简单如equals
比较它们是否共享相同的内存区域,Arrays.equals
比较数组的内容。
答案 3 :(得分:0)
变量a和b位于不同的存储位置。 如果你打印a和b,它将使用不同的哈希码打印。
因此 a == b 和 a.equals(b)提供 false
在java源代码中,equals方法代码如下所示
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;
}
答案 4 :(得分:0)
a.equals(b)
只需使用Object.equals()
(byte []是一个Object并且不要覆盖方法equals()),请参阅源代码:
public boolean equals(Object obj) {
return (this == obj);
}
==
比较引用的地址。(不考虑特殊类型:String,int等)
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;
}