Eine Liste in eine andere Liste in Java kopieren

Kopieren Sie eine Liste in eine andere Liste in Java

1. Überblick

In diesem kurzen Tutorial zeigen wir verschiedene Möglichkeiten zum Kopieren vonList in ein anderesList und einen dabei auftretenden häufigen Fehler.

Eine Einführung in die Verwendung vonCollections finden Sie unterto this article here.

2. Konstrukteur

Eine einfache Möglichkeit, einList zu kopieren, besteht darin, den Konstruktor zu verwenden, der eine Sammlung als Argument verwendet:

List copy = new ArrayList<>(list);

Aufgrund der Tatsache, dass wir hier die Referenz kopieren und die Objekte nicht klonen, wirken sich alle in einem Element vorgenommenen Änderungen auf beide Listen aus.

Aus diesem Grund empfiehlt es sich, den Konstruktor zum Kopieren unveränderlicher Objekte zu verwenden:

List copy = new ArrayList<>(list);

Integer ist eine unveränderliche Klasse. Ihr Wert wird beim Erstellen der Instanz festgelegt und kann sich nie ändern.

Die Referenz einesIntegerkann somit von mehreren Listen und Threads gemeinsam genutzt werden, und niemand kann seinen Wert ändern.

3. ListConcurrentAccessException

A common problem working with lists is the ConcurrentAccessException. Dies kann bedeuten, dass wir die Liste ändern, während wir versuchen, sie zu kopieren, höchstwahrscheinlich in einem anderen Thread.

Um dieses Problem zu beheben, müssen wir entweder:

  • Verwenden Sie eine Sammlung für den gleichzeitigen Zugriff

  • Sperren Sie die Auflistung entsprechend, um sie zu durchlaufen

  • Finden Sie eine Möglichkeit, die Originalsammlung nicht kopieren zu müssen

In Anbetracht unseres letzten Ansatzes ist es nicht threadsicher. Wenn wir unser Problem mit der ersten Option lösen möchten, möchten wir möglicherweiseCopyOnWhiteArrayList verwenden, in denen alle mutativen Operationen implementiert werden, indem eine neue Kopie des zugrunde liegenden Arrays erstellt wird.

Weitere Informationen finden Sie unterto this article.

Wenn wirCollection sperren möchten, können Sie ein Sperrprimitiv verwenden, um den Lese- / Schreibzugriff zu serialisieren, z. B.ReentrantReadWriteLock.

4. AddAll

Ein anderer Ansatz zum Kopieren von Elementen ist die Verwendung deraddAll-Methode:

List copy = new ArrayList<>();
copy.addAll(list);

Es ist wichtig zu beachten, dass bei Verwendung dieser Methode der Inhalt beider Listen wie beim Konstruktor auf dieselben Objekte verweist.

5. Collections.copy

Die KlasseCollectionsbesteht ausschließlich aus statischen Methoden, die Sammlungen bearbeiten oder zurückgeben.

Eines davon istcopy, das eine Quell- und eine Zielliste benötigt, die mindestens so lang sind wie die Quelle.

Der Index jedes kopierten Elements in der Zielliste wird beibehalten, z. B. das Original:

List source = Arrays.asList(1,2,3);
List dest = Arrays.asList(4,5,6);
Collections.copy(dest, source);

Im obigen Beispiel wurden alle vorherigen Elemente in der Listedestüberschrieben, da beide Listen dieselbe Größe haben.

Falls die Größe der Zielliste größer ist als die der Quelle:

List source = Arrays.asList(1, 2, 3);
List dest = Arrays.asList(5, 6, 7, 8, 9, 10);
Collections.copy(dest, source);

Nur die drei ersten Elemente wurden überschrieben, während die übrigen Elemente in der Liste erhalten bleiben.

6. Java verwenden 8

Diese Java-Version eröffnet unsere Möglichkeiten, indem sie neue Tools hinzufügt. Das, was wir in den nächsten Beispielen untersuchen werden, istStream:

List copy = list.stream()
  .collect(Collectors.toList());

Die Hauptvorteile dieser Art sind die Möglichkeit, Überspringen und Filtern zu verwenden. Im nächsten Beispiel überspringen wir das erste Element:

List copy = list.stream()
  .skip(1)
  .collect(Collectors.toList());

Es ist auch möglich, nach der Länge derStringzu filtern oder ein Attribut unserer Objekte zu vergleichen:

List copy = list.stream()
  .filter(s -> s.length() > 10)
  .collect(Collectors.toList());
List flowers = list.stream()
  .filter(f -> f.getPetals() > 6)
  .collect(Collectors.toList());

Es ist wahrscheinlich, dass wir nullsicher arbeiten möchten:

List flowers = Optional.ofNullable(list)
  .map(List::stream)
  .orElseGet(Stream::empty)
  .collect(Collectors.toList());

Und überspringen Sie ein Element auch so:

List flowers = Optional.ofNullable(list)
  .map(List::stream).orElseGet(Stream::empty)
  .skip(1)
  .collect(Collectors.toList());

7. Java 10 verwenden

Schließlich können wir mit einer der letzten Java-Versionen unveränderlicheList erstellen, die die Elemente der angegebenenCollection: enthalten

List copy = List.copyOf(list);

Die einzigen Bedingungen sind, dass die angegebene Sammlung nicht null sein darf und keine null Elemente enthalten darf.

8. Fazit

In diesem Artikel haben wir verschiedene Möglichkeiten untersucht, um einList in ein anderesList mit unterschiedlichenJava-Versionen und einem dabei auftretenden häufigen Fehler zu kopieren.

Wie immer finden Sie Codebeispiele auf GitHubhere undhere.