Eine List ist laut Doku:
An ordered collection (also known as a sequence).
Eine
Collection ist einfach nur eine Menge an Elementen. Eine Liste konkretisiert das weiter, weil eine Collection keine Reihenfolge hat, du also nicht das Element an der zweiten Position abfragen kannst. Eine weitere Konkretisierung (Subinterface) ist
Set. Das hat keine Reihenfolge, erlaubt aber keine doppelten Elemente.
Das sind aber alles nur Interfaces, das heißt sie definieren eine Menge an Methoden (und was die machen sollen) die implementiert werden müssen damit die Klasse dieses Interface erfüllt, also als dieses verwendet werden kann.
Die Implementierungen für eine List sind dann beispielsweise eine
LinkedList. In dieser haben die Elemente jeweils einen Verweis (Pointer) auf das nächste und das vorherige Element. Eine andere ist die
ArrayList, dabei liegen die Elemente in einem Array das durch ein größeres ersetzt wird falls es zu voll ist.
Die Implementierungen bestimmen dann die Kosten für bestimmte Operationen, beispielsweise braucht ein
list.get(i) bei einer LinkedList O(n), bei einer ArrayList geht das in konstanter Laufzeit O(1).
Es ist wichtig für den richtigen Zweck die richtige Implementierung auszuwählen (zB häufiger Zugriff auf bestimmte Indizes -> ArrayList). Die Interfaces erlauben aber, Funktionen unabhängig von der Implementierung zu schreiben, sodass zum Beispiel
sort für alle Listen andwendbar ist. Du kannst auch deine eigene Liste schreiben und die wird mit allen Funktionen funktionieren die eine List (oder eine Collection) erwarten.
Zu deiner Iterator frage: Normalerweise implementiert man den Iterator als innere Klasse der iterierbaren Klasse (
Iterable ist btw das Superinterface von Collection). Im Fall der Liste gibt es aber den
ListIterator der dank des Interfaces mit allen Listen funktioniert.
Ich kann dir empfehlen dir mal die verlinkte Doku anzuschauen, in der Beschreibung stehen da genau die Eigenheiten der einzelnen Interfaces/Klassen. Das Konzept der Interfaces (das ist nur der Java-Name) ist zentral für Objektorientierung, es erlaubt dir Funktionalität von Implementierung zu trennen.
Edit: Eine List selbst zu schreiben ist vielleicht eine gute Übung, man muss dazu aber eine Menge Methoden implementieren. UML brauchst du dazu nicht, geh einfach die
Liste der Methoden durch und lass deine Klasse List implementieren.