obtenir la valeur de retour de la méthode

N'hésitez pas :

je lance suivant codes dans Eclipse:

ArrayList<StringBuilder> list = new ArrayList<StringBuilder>();
ArrayList<Integer> alist = new ArrayList<Integer>();

// add some elements ti list
list.add(new StringBuilder("hello"));
list.add(new StringBuilder("2"));
list.add(new StringBuilder("hi"));
list.add(new StringBuilder("this"));

// add some elements to alist
alist.add(4);
alist.add(9);


//get method
StringBuilder a = list.get(3);
a.append(" is a good day");
int b = alist.get(1);
b = 7;

// print the list
System.out.println("LinkedList:" + list);
System.out.println("ArrayList:" + alist);

et le résultat est ici

LinkedList:[hello, 2, hi, this is a good day]
ArrayList:[4, 9]

On dirait que retourne la méthode d'obtenir une copie peu profonde de l'élément de liste (dans le cas de StringBuilder) à l'un, mais retourne une copie complète (dans le cas d'entier) au b! pourquoi cela est arrivé? Ne la méthode get renvoie une profonde ou peu profonde copie des éléments de la liste?

Ils étaient les suivants:

getrenvoie une référence à l' Listélément, et non une copie (ni profonde ni peu profonde).

Dans le premier extrait que vous muter l'objet référencé par la variable a, de sorte que le Listest également affectée:

StringBuilder a = list.get(3);
a.append(" is a good day");

Dans le second extrait que vous attribuez une nouvelle valeur à la variable b, qui ne touche pas le List:

int b = alist.get(1);
b = 7;

Pour que votre premier extrait à se comporter comme le second, vous devez écrire:

StringBuilder a = list.get(3);
a = new StringBuilder(" is a good day");

et Listne seront pas affectés.

De l'autre façon, vous ne pouvez pas faire le deuxième extrait se comportent comme le premier. Même si vous avez attribué l' Listélément à une Integervariable, vous ne pouvez pas appeler une méthode qui muter, puisque elle Integerest immuable.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=205359&siteId=1
conseillé
Classement