2016-04-03 8 views
1

Ich lese derzeit Java-API auf Arrays-Klasse und für DeepEquals (Object [] a1, Objekt [] a2) -Methode ich habe folgenden Ausdruck angetroffen:Kann nicht verstehen: Wenn eines der angegebenen Arrays sich selbst als Elemente enthalten, ist das Verhalten dieser Methode nicht definiert

Wenn eine der angegebenen Arrays selbst als Elemente enthält entweder direkt oder indirekt über eine oder mehr Ebene von Arrays, das Verhalten dieser Methode ist nicht definiert.

Ich verstehe nicht vollständig, was der Ausdruck tatsächlich bedeutet.

+2

Es ist eine ziemlich direkte Phrase; Welchen Teil verstehst du nicht? Wenn Sie das Konzept eines Arrays kennen, das sich selbst enthält, und Sie verstehen, was mit undefiniertem Verhalten gemeint ist, dann sehe ich nicht, mit was Sie Probleme haben. Wenn Sie eines dieser Dinge nicht verstehen, dann sagen Sie es. – davmac

Antwort

4

Wenn ein Array, das an diese Methode übergeben wird, sich selbst enthält, kann das Testen des gleichen Arrays zu einer unendlichen Rekursion führen (endend in StackOverflowError), da immer ein Element des Arrays selbst ein Array ist Sie werden eine weitere Ebene zum Vergleichen haben.

Es kann nicht in allen Szenarien eine unendliche Rekursion verursachen, da, wenn zum Beispiel das erste Elementpaar der beiden verglichenen Arrays kein Array ist und die beiden Elemente nicht gleich sind, die Methode false ohne zurückgeben kann jemals den Rest der Arrays untersuchen.

Das ist wahrscheinlich der Grund, warum es für diesen Fall kein definiertes Verhalten gibt, da es möglicherweise nicht möglich ist, eine korrekte Ausgabe zurückzugeben (oder überhaupt etwas zurückzugeben, ohne dass eine Ausnahme auftritt), wenn eine solche Eingabe an die Methode übergeben wird.

Zum Beispiel:

Object[] objArr = new Object[1]; 
objArr[0] = objArr; 

Dieses Array enthält selbst, so dass es zu deepEquals geben kann Endlosschleife verursachen.

+0

vielen dank für ihre hilfe !! Wording in der Dokumentation kann für Anfänger wie mich schwer verständlich sein. – Thor

1

Es besagt, dass, wenn der Name des Arrays ist a1 und a1 [i] = a1; wo ich < a1.length, dann ist das Verhalten der Methode nicht definiert. Wenn die Methode jedes Element einzeln überprüft, könnte es irgendwann zu einer unendlichen Rekursion kommen.

Object[] a1 = new Object[5]; 
a1[0] = a1; // array is an element of itself 
Object[] a2 = new Object[5]; 
deepEquals(a1,a2); //behavior is undefined 
+0

Sie haben "entweder direkt oder indirekt durch ein ** oder mehr Ebenen von Arrays" verpasst. Ihr Beispiel zeigt nur eine Ebene. – davmac