Wie verschiebe ich Inhalte einer ArrayList in eine andere?

Gibt es eine Möglichkeit, den gesamten Inhalt einer ArrayList in eine andere Instanz von ArrayList in O (1) zu verschieben?

Dh: nur die Referenz auf das Backing-Array wird von einer Instanz zur anderen weitergegeben (Elemente werden nicht einzeln kopiert).

Zum Beispiel:

<code>ArrayList<String> a = new ArrayList<>(Arrays.asList("A", "B", "C"));
ArrayList<String> b = new ArrayList<>();
a.moveContentsTo(b);
// 'a' is now empty, while 'b' contains everything that 'a' did before and 'a != b'
// It is desired that the 'moveContentsTo' method is O(1)
</code>

Noch besser ist es dortArrayList#swapContents(ArrayList) Methode?

Weitere Erklärung und Anwendungsfall:

Weitere Erklärung 1: Die Referenzen von 'a' und 'b' dürfen nicht ausgetauscht werden. ich bin nicht auf der Suche nachtmp = a; a = b; b = tmp; Art der Lösungen.

Weitere Erklärung 2: Die Operation muss rechtzeitig ~ O (1) sein.

Der Anwendungsfall: Dies ist nützlich, wenn ein Objekt eine außerhalb erstellte Liste einkapseln möchte:

<code>public class A {
    private ArrayList<String> items = new ArrayList<>();

    /**
     * This method takes the sole ownership of the contents. Whoever
     * passed the list from the outside will not be able to modify
     * contents of 'this.items' from outside the class.
     */ 
    public AnImmutableObject(ArrayList<String> items) {
        if (items != null) {
            items.moveContentsTo(this.items);
        }
    }

    /**
     * Other collections that do not provide the 'move' functionality
     * must be copied. If we just stored the reference to 'items' we
     * would break encapsulation as whoever called the constructor
     * still have write capabilities to the collection.
     */ 
    public A(Collection<String> items) {
        if (items != null) {
            this.items.addAll(items);
        }
    }

    public List<String> getItems() {
        return Collections.unmodifiableList(items);
    }
}
</code>

Beachten Sie, dass wir das Erstellen einer Kopie vermeiden möchten (um die Geschwindigkeit zu erhöhen und die Speichernutzung zu verringern). Das Entscheidende ist, dass der Angerufene die Fähigkeit verlieren muss, die (jetzt gekapselte)ArrayList.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage