为什么==和.equals都不能用于Java中的字节数组?

时间:2016-03-29 07:43:30

标签: 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

5 个答案:

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