Java - 我从equals方法得到了错误的输出

时间:2017-12-15 18:13:15

标签: java

我试图测试我的物体是否相等! 关于这个阵列,输出应该是:


错误

但是我得到了这个输出:


错误

为什么第一个等式是假的?

//arrays
a = {1, 2, 3}
b = {1, 2, 3}  
c = {2, 3, 1} 

static void testEquals(Scanner scanner) {
    int[] a = readArray(scanner);
    int[] b = readArray(scanner);
    int[] c = readArray(scanner);
    IntegerArray ia = new IntegerArray(a);
    IntegerArray ib = new IntegerArray(b);
    IntegerArray ic = new IntegerArray(c);
    System.out.println(ia.equals(ib));
    System.out.println(ia.equals(ic));
    System.out.println(ib.equals(ic));
}

以下是IntegerArray类的实现:
*注意:此类必须是不可变的

final class IntegerArray {
private int[] a;

public IntegerArray(int arr[]) {
    a = new int[arr.length];
    for(int i = 0; i < a.length; i++)
    {
        a[i] = arr[i];
    }
}

public int length() {
    return a.length;
}

public int getElementAt(int i) {
    return a[i];
}

public int sum() {
    int sum = 0;
    for(int i = 0; i < a.length; i++)
    {
        sum += a[i];
    }
    return sum;
}

public double average() {
    return (double) this.sum() / this.length();
}

public IntegerArray getSorted() {
    int[] temp = Arrays.copyOf(a, a.length);
    Arrays.sort(temp);
    return new IntegerArray(temp) ;
}
}

3 个答案:

答案 0 :(得分:1)

------ ------ FIXED
谢谢大家的时间和帮助!!
我通过覆盖equals()hashCode()方法修复了我的程序

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    IntegerArray that = (IntegerArray) o;

    return Arrays.equals(a, that.a);
}

@Override
public int hashCode() {
    return Arrays.hashCode(a);
}

答案 1 :(得分:0)

假设您使用Xalan for Java中的IntegerArray类,问题是该类没有为equals()hashCode()提供覆盖。这就是使用默认Object比较的原因,它比较了对IntegerArray个对象的引用。

不幸的是,你无法从Xalan的IntegerArray类派生,因为它是final。您可以编写自己的包装器,或直接比较int[]数组,如this Q&A中所述。

答案 2 :(得分:-1)

根据Java 8,包装类对象的值永远不应该等于基本类型值。作为一个是我们的原始数组,ia是一个包装类数组。所以它们分别存储在堆和堆栈中的不同位置。为了更好理解你可以通过这段代码并在java ide上运行它。

the image shows you the difference in the values of both the two arrays