wie vergleiche ich in java zwei arrays? Mit arrays.equals(array1,array2) oder wie genau? Und was ist deepequals?

1 Antwort

Zwei Arrays können mithilfe von Arrays.equals auf Gleichheit überprüft werden. Dies funktioniert allerdings nicht für verschachtelte Arrays. Dafür kann Arrays.deepEquals genutzt werden. Siehe Dokumentation.

Beispiel:

int[][] a = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int[][] b = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        
System.out.println(Arrays.equals(a, b));
System.out.println(Arrays.deepEquals(a, b));

Dies liefert:

false
true

Das liegt daran, dass Arrays.deepEquals auch Arrays in den Arrays rekursiv mittels Arrays.deepEquals inhaltich vergleicht. Arrays.equals dagegen vergleicht die Elemente der beiden Arrays mittels Objects.equals, was bei Arrays dem Operator == entspricht, d. h. von inneren Arrays werden lediglich die Referenzen und nicht deren Inhalte verglichen. Demnach liefert

int[] x = {1, 2, 3};
int[] y = {4, 5, 6};
int[] z = {7, 8, 9};
        
int[][] a = {x, y, z};
int[][] b = {x, y, z};
        
System.out.println(Arrays.equals(a, b));

true, weil die inneren Arrays hier die gleichen Referenzen haben.

Arrays.deepEquals funktioniert übrigens für beliebig tief verschachtelte Arrays.

malte314  03.01.2022, 17:22

Schöne Zusammenfassung aber eine Sache hast Du hier leider durcheinandergebracht. Die equals und die deepEquals Methoden vergleichen nämlich nicht die Referenzen, sondern die Werte.

während Arrays.equals lediglich die Referenzen der Arrays vergleicht.

Würde das stimmen, wäre die equals Methode ja semantisch gleich zum == Operator, das ist sie natürlich nicht.

Der unterschied zu deepEquals ist dann, dass diese auch verschachtelte Arrays nach Werte-Gleichheit überprüft--und eben nicht nach Referenz-Gleichheit. Somit ist auch hier der elementare Unterschied zwischen "equals" und == gegeben.

https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/Arrays.java

1
321QWERTZ123  04.01.2022, 02:26
@malte314

Das habe ich leider etwas unglücklich formuliert. Ich habe die Antwort angepasst, sollte jetzt besser sein.

1