2016-05-18 12 views
1

im Grunde ist die Ausgabe für den Code unten 2. Könnte mir jemand erklären, warum das so ist? Ich danke dir sehr :).Multidimensionaler Array-Ausgang?

int[][] x = {{3,1,4},{1,5,9}}; 
int[] y = {2,6,7}; 
y = x[1]; 
y[1] = 1; 
System.out.println (x[0][1] + x[1][1]); 
+0

@Gendarme ich aha die Ausgabe wie das ist geprüft. –

+1

@JCole '1 + 1 = 2' Dies ist ein grundlegendes Java ... –

+1

Dies liegt daran, dass Sie' int [] y' zuweisen, um 'int [] [] x' zweite Zeile zu sein. Also, was auch immer du mit "y" machst, wird auch in "x" vorkommen. Sie möchten 'Array.clone()' oder 'Array.copy()' verwenden, damit dieses Problem nicht auftritt. – robotlos

Antwort

1

Das Problem, das Sie haben ist, daß sowohl y und x [1] die gleiche Referenz-Array. Weitere Informationen finden Sie in den Kommentaren.

int[][] x = {{3,1,4},{1,5,9}}; // x[0] references an array {3,1,4}; x[1] references an array {1,5,9} 
int[] y = {2,6,7}; // You create the array {2,6,7} assigning its reference to y 
y = x[1]; // While y was referencing the array {2,6,7} you overwrite this reference by the reference stored at x[1]. This reference is pointing at the array {1,5,9}. So now both y and x[1] are pointing to (or referring to in Java slang) the same array! 
y[1] = 1; // So now you are changing the array {1,5,9} to {1,1,9} (y[1] is the same as x[1][1] 
System.out.println (x[0][1] + x[1][1]); // x[0][1] (meaning the second value from the first array (referenced by x), which value is 1.) x[1][1] (meaning the second value from the second array, which value is also 1.) So 1 + 1 is in fact 2. 
1

Bevor ich zu erklären beginnen, denken Sie daran: Ein int ist ein primitiver Typ; Ein Array ist ein Objekt.

Werfen Sie einen Blick auf diesen einfachen Code:

int[] x = {1,2,3}; 
int y = x[0]; 
y = 5; 
System.out.print(x[0]); 

der Ausgang 1 und nicht5 aus dem folgenden Grund ist:

y wird den Wert vonx[0] zugeordnet ist, im Wesentlichen eine Kopie davon bekommen. Es zeigt nicht auf x[0], so dass zukünftige Änderungen an y nicht für x gelten.


In Ihrer Situation mit zweidimensionalen Anordnungen, haben Sie den folgenden Code:

int[][] x = {{3,1,4},{1,5,9}}; 
int[] y = {2,6,7}; 
y = x[1]; 
y[1] = 1; 
System.out.println (x[0][1] + x[1][1]); 

Der wesentliche Unterschied hier ist die folgende:

y zugeordnet werden der Wert des Referenz vonx[1], die auch hier eine Kopie ist, aber da es eine Referenz ist (denn x[1] ist ein Array) ist es nicht wirklich wichtig, das Original an d Die Kopie zeigt auf das gleiche Objekt. Ob Sie y oder x[1] verwenden, Sie beziehen sich auf das gleiche Objekt, obwohl dies zwei verschiedene Referenzen sind.

1

Da Variablen-Arrays in Java (wie andere Objekte) sind nur Verweise auf diese Objekte

In mehr Details enthalten:

Beim Start:

  • x [0] gleich ist bis {3, 1, 4}
  • x [1] ist gleich {1, 5, 9}
  • y ist gleich {2, 6, 7}

Dies ist einfach.

Dann

Wenn wir das tun y = x [1], wir haben nicht die Werte von y ändern. Statt dessen, was passiert ist, dass y jetzt Punkte x [1]

In Erinnerung haben wir irgendwo das Array {1, 5, 9} und zwei Variablen suchen dort (x [1] und y).Das bedeutet auch, dass wir im Speicher immer noch das Array {2, 6, 7} haben, aber keine Variable es anschaut (auf es zeigt), da y geändert wurde, um den gleichen Ort wie x [1] zu betrachten. In Java, findet der Garbage Collector automatisch, was Speicherplatz nicht mehr verwendet werden und reinigt den Speicher

So endlich

Ändern entweder x [0] oder y den gleichen Platz im Speicher so den Wert zugreifen wird sich für beide Variablen ändern. tun

y[1] = 1; 

ist genau das gleiche wie zu tun

x[1][1] = 1; 

Dabei wir das Array ändern und es wird {1, 1, 9}

So x[0][1] + x[1][1] gleich 1+1

Dies tritt bei der Programmierung immer auf, da dies für alle Objekte das gleiche Verhalten ist.

Seitennotiz Sie werden sehen, dass viele Leute über die genaue Terminologie streiten, wenn sie von Referenzen in Java sprechen. Java wird nicht wie bei C++ durch Verweis übergeben. Was Sie shoud für einen Start erinnern, wie Variablen verhalten, wenn sie auf Arrays zugewiesen oder Objekte

1

Unsere Ausgangsposition ist

int[][] x = {{3,1,4},{1,5,9}}; 
int[] y = {2,6,7}; 

die als

gezeigt werden kann
 
x → { [0]  ,  [1]  } 
     ↓    ↓   // each 1D array like {3,1,4} can be also shown as 
     {3,1,4}  {1,5,9} // { [0] [1] [2] } 
            //  ↓ ↓ ↓ 
y → {2,6,7}      //  3 1 4 but I skipped that for simplicity 

(da jede 2D-Array in Java ist einfach 1D Array von anderen 1D Arrays).

Wenn wir ausführen y = x[1];y wird nun Bezug auf gleichen Array sein, die in x[1] gespeichert ist (es ist nicht von Original-Array mit gleichen Elemente kopiert wird, ist es elbe Array ist).

So Situation Bogen ist ähnlich

 
x → { [0]  ,  [1]  } 
     ↓    ↓ 
     {3,1,4}  {1,5,9} 
         ↑ 
y ──────────────────────┘ 

Das bedeutet, dass wir das gleiche Array über zwei Referenzen ändern können y und x[1] und jede Änderung kann auch über andere Referenz zu sehen.

Wenn wir also

y[1] = 1; 

tun es auch Array von x[1] gehalten beeinflussen wie

 
x → { [0]  , [1]  } 
      ↓   ↓ 
      {3,1,4}  {1,1,9} 
         ↑ └─changed 
y ─────────────────────┘ 

Jetzt x wie {{3,1,4},{1,1,9}}; aussieht.

 
x → {  
├[0] → { 
│ ├─[0] → 3 
│ ├─[1] → 1 //x[0][1] 
│ └─[2] → 4 
│  } 
└[1] → { 
    ├─[0] → 1 
    ├─[1] → 1 //x[1][1] 
    └─[2] → 9 
     } 
    } 

So, da x[0][1] = 1 und x[1][1]=1 ihre Summe 2.

+0

Vielen Dank, es macht jetzt Sinn, ich war verwirrt, als es x [0] [1] sagte. Es ist jetzt klarer, danke vielmals :). Gendarm, Robert, Toaster und Pshemo :). –

1

der Grund, warum:

int[][] x = {{3,1,4},{1,5,9}}; 
    int[] y = {2,6,7}; 
    y = x[1]; //{1, 5, 9} 
    y[1] = 1; //{1, 1, 9} 
    System.out.println (x[0][1]/* {3,*1*,4} */ + x[1][1] /* {1, *1*, 9} */); 

in Java, wenn Sie Array wie diese y = x[1]; zuweisen oder Array beliebig möglich (auf Verfahren zum Beispiel) übergeben Sie tatsächlich Kopie referencex[1] Array zu einem anderen übergeben y, Array gleichen Bezug wie x-GC wo Array Exsis und wenn Sie den Wert ändern y[1]

y[1] = 1; //{1, 1, 9} 

Sie tatsächlich Wert zu ändern sind Aktien es zwischen y[1] und x[1][1]