2016-06-04 14 views
0

wenn dies eine flache KopieJava flache Kopie Array

double[] a = new double[100]; 
a = b; // let b be some other double array[100] 

Ich verstehe, dass der bessere Weg, dies zu tun, wird unter Verwendung eines for-Schleife oder mit

System.arrayCopy(b,0,a,0,100); 

jedoch, was dies geschieht?

public double[] function1(){ 
    returns somedouble[100]; 
} 

double[] a = new double[100]; 
a = function1(); // i believe this will also be a shallow copy 

System.arrayCopy(function1(),0,a,0,100); // will this call function1 100 times? 
+0

a = b ist nicht eine flache Kopie. Es ändert nur den a-Zeiger, um auf den Anfang von b zu zeigen. – aviad

+0

Wenn es ein primitives Array ist, gibt es keinen Unterschied zwischen seichter und tiefer Kopie. Zuerst müssen Sie den Primitiv-/Referenztyp in Java verstehen. Dann lernst du primitive/Referenz-Arrays. Dann weißt du, dass es eine "flache oder tiefe Kopie" über das Referenz-Array gibt. – waltersu

Antwort

2
double[] a = new double[100]; 
a = b; // let b be some other double array[100] 

Erstellen Sie ein Array a Doppel mit einer Größe von 100. Nun genannt, wenn Sie a = b wird Kopiere die Referenz von b array in die Variable a.

 +--------------------------------------------+ <- Suppose whole 
a-> | 2.5 | | | | | | | | | | | | | | array is filled 
    +--------------------------------------------+ with value 2.5 

    +--------------------------------------------+ <- Suppose whole 
b-> | 7.9 | | | | | | | | | | | | | | array is filled 
    +--------------------------------------------+ with value 7.9 

nach a = b

 +--------------------------------------------+ <- Suppose whole 
    | 2.5 | | | | | | | | | | | | | | array is filled 
    +--------------------------------------------+ with value 2.5 

a-> +--------------------------------------------+ <- Suppose whole 
b-> | 7.9 | | | | | | | | | | | | | | array is filled 
    +--------------------------------------------+ with value 7.9 

So, jetzt a und b zeigt auf gleiche Array.

public double[] function1(){ 
    return somedouble[100]; 
} 

double[] a = new double[100]; 
a = function1(); 

Jetzt ist das gleiche hier passiert. Sie erstellen ein Array mit dem Namen a und rufen dann function1() auf und weisen wieder den zurückgegebenen Array-Bezug zu a zu. > Function1() und die Rückkehr Array-Referenz genannt werden wird in einer temporären Variablen gespeichert werden -

System.arraycopy(function1(), 0, a, 0, 100); 

Hier ist die Berufung Auftrag

1 sein wird.

2 -> Aufruf System.arraycopy(temporary variable, 0, a, 0, 100)

So function1() wird nur einmal aufgerufen werden.

Als Randnotiz stellen Sie sicher, System.arraycopy(args) anstelle von System.arrayCopy(args)

+0

danke für die Klarstellung – user2478240

0
double[] a = new double[100]; 
    a = b; // let b be some other double array[100] 

Erstens, es ist die Zuordnung zu kopieren nicht.


double[] a = new double[100]; 
    a = function1(); // i believe this will also be a shallow copy 

Es zuweisen. weisen Sie den Wert somedouble zurück [100] zu a


System.arraycopy (function1(), 0, a, 0.100); // Wird diese Funktion 100 Mal aufgerufen?

Nein, es wird function1 nicht 100 Mal aufgerufen. Der obige Code entspricht meist zu

double[] tmpref = function1(); 
    System.arrayCopy(tmparr,0,a,0,100); 

Weil es zunächst die Argumente auswertet, dann nennt es arrayCopy

+0

Grund für den Downvote? – waltersu

+0

Danke für die Klarstellung. Ich bin mir nicht sicher, wer es abgelehnt hat, aber deine Antwort war mir definitiv hilfreich. Upvote für Sie, mein Herr. – user2478240

Verwandte Themen