2017-12-15 3 views
1

ここで私のオブジェクトが等しいかどうかをテストしようとしています!最初の等式がFalseなぜ


Java - equalsメソッドの出力が間違っています

を:


しかし、私はこの出力を取得しています:これは、出力があるべきするアレイについて
?ここで

//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) ; 
} 
} 
+4

をオーバーライドすることで、私のプログラムを修正しました。あなたはおそらく 'equals'をオーバーライドしていません。 – rgettman

+0

あなたの前提が正しくありません。この場合のオブジェクト参照のメソッドチェックを行います。 – RamPrakash

+2

はい、iaとibは、メンバーが等しくなる2つの異なるオブジェクトです。しかし、それらは異なったオブジェクトです – Tyler

答えて

0

あなたはXalan for JavaからIntegerArrayクラスを使用している、問題はクラスがないことであると仮定すると、 equals()hashCode()のオーバーライドを指定しないでください。そのため、デフォルトのObjectの比較が使用され、IntegerArrayオブジェクトの参照が比較されます。

XalanのIntegerArrayクラスは残念ながらfinalであるため、派生することはできません。 this Q&Aで説明されているように、独自のラッパーを記述したり、int[]配列を直接比較したりすることができます。

-1

ラッパークラスのオブジェクトの値は、プリミティブ型の値と同じであってはいけません。私たちのプリミティブな配列であり、iaはラッパークラスの配列です。したがって、それぞれヒープとスタックの異なる場所に格納されます。あなたはこのコードを理解し、それをjava ideで実行することができます。 FIXED

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

1

------ ------
は、あなたの時間と助けをみんなありがとう!
私はあなた `IntegerArray`クラスを示してください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); 
} 
関連する問題