Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么==和.equals都不能在Java中使用字节数组?_Java_Arrays - Fatal编程技术网

为什么==和.equals都不能在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

为什么==不能在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 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==ba.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;i
a.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,你会看到…”不,至少你是说
字节[]