J'ai un ArrayList
l1
de taille 10. J'attribue l1
à un nouveau type de référence de liste l2
. Will l1
et l2
pointer vers le même ArrayList
objet? Ou une copie de l' ArrayList
objet est-elle affectée l2
?
Lorsque l2
j'utilise la référence, si je mets à jour l'objet de liste, il reflète également les changements dans le l1
type de référence.
Par exemple:
List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
l1.add(i);
}
List l2 = l1;
l2.clear();
N'y a-t-il pas d'autre moyen d'affecter une copie d'un objet liste à une nouvelle variable de référence, à part la création de 2 objets liste et la copie sur des collections de l'ancien vers le nouveau?
List.subList
pour obtenir une "vue" sur une section de la liste d'origine.(ArrayList<ArrayList<Object>>)
? cela créerait-il récursivement des copies de tous les objets ArrayList enfants?Essayez d'utiliser
Collections.copy(destination, source);
la source
new ArrayList<>(source);
?Collections.copy
n'est pas du tout une alternative ànew ArrayList<>(source)
. Ce quiCollections.copy
se passe en réalité, c'est de supposer qu'ildestination.size()
est au moins aussi grand quesource.size()
, puis copiez la plage index par index à l'aide de laset(int,E)
méthode. La méthode n'a pas ajouter de nouveaux éléments à la destination. Reportez-vous au code source s'il n'est pas suffisamment clair à partir de Javadoc.Oui
l1
etl2
pointera vers la même référence, le même objet.Si vous souhaitez créer une nouvelle liste de tableaux basée sur l'autre liste de tableaux, procédez comme suit:
Le résultat sera
l1
aura toujours 2 éléments etl2
aura 3 éléments.la source
List<String> l2 = new ArrayList<String>(l1)
etList<String> l2 = l1
?Un autre moyen pratique de copier les valeurs de src ArrayList vers dest Arraylist est le suivant:
Il s'agit d'une copie réelle de valeurs et pas seulement d'une copie de référence.
la source
Il existe une méthode addAll () qui servira à copier un ArrayList dans un autre.
Par exemple, vous avez deux listes de tableaux : sourceList et targetList , utilisez le code ci-dessous.
targetList.addAll (sourceList);
la source
Java ne transmet pas d'objets, il transmet des références (pointeurs) aux objets. Alors oui, l2 et l1 sont deux pointeurs vers le même objet.
Vous devez faire une copie explicite si vous avez besoin de deux listes différentes avec le même contenu.
la source
List.copyOf
List liste non modifiableTu as demandé:
Java 9 a apporté les
List.of
méthodes d'utilisation des littéraux pour créer uneList
classe concrète inconnue et non modifiable .Parallèlement à cela, nous avons également obtenu
List.copyOf
. Cette méthode renvoie également uneList
classe concrète inconnue et non modifiable .Par «non modifiable», nous entendons le nombre d'éléments dans la liste, et le référent objet tenu dans chaque emplacement comme élément, est fixe. Vous ne pouvez pas ajouter, supprimer ou remplacer des éléments. Mais le référent objet contenu dans chaque élément peut ou non être mutable .
Découvrez ce code en direct sur IdeOne.com .
Vous avez posé des questions sur les références d'objets. Comme d'autres l'ont dit, si vous créez une liste et l'affectez à deux variables de référence (pointeurs), vous n'avez toujours qu'une seule liste. Les deux pointent vers la même liste. Si vous utilisez l'un ou l'autre pointeur pour modifier la liste, les deux pointeurs verront ultérieurement les modifications, car il n'y a qu'une seule liste en mémoire.
Vous devez donc faire une copie de la liste. Si vous souhaitez que cette copie ne soit pas modifiable, utilisez la
List.copyOf
méthode décrite dans cette réponse. Dans cette approche, vous vous retrouvez avec deux listes distinctes, chacune avec des éléments qui contiennent une référence aux mêmes objets de contenu. Par exemple, dans notre exemple ci-dessus utilisant desString
objets pour représenter des couleurs, les objets de couleur flottent quelque part en mémoire. Les deux listes contiennent des pointeurs vers les mêmes objets de couleur. Voici un schéma.La première liste
colors
est modifiable. Cela signifie que certains éléments pourraient être supprimés comme indiqué dans le code ci-dessus, où nous avons supprimé le 3e élément d'origineChartreuse
(index de 2 = ordinal 3). Et des éléments peuvent être ajoutés. Et les éléments peuvent être modifiés pour pointer vers d'autresString
tels queOliveDrab
ouCornflowerBlue
.En revanche, les quatre éléments de
masterColors
sont fixes. Aucun retrait, aucun ajout et aucun remplacement d'une autre couleur. CetteList
implémentation n'est pas modifiable.la source