Unterschied zwischen List und LinkedList implementierung?

L

Lyreex

Aktives Mitglied
Hallo,

ich hätte da mal eine Verständnis frage zur Implementierung von Listen.

Implementierung gegen das Interface Liste:
List<String> list = new LinkedList<>();
list.add("def");
list.addFirst("abc") //Error -> addFirst gibts nicht

Implementierung gegen konkrete List Klasse:
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("def");
linkedList.addFirst("abc"); //Kein Error, addFirst existiert

In meinem ersten Code Beispiel hab ich gegen das Interface implementiert aber dann nicht die eigentlichen Funktionen von
Java:
LinkedList<>()
während im zweiten Beispiel die Funktionen da sind. Da wird auch direkt gegen
Java:
LinkedList<>()
implementiert.

Aber warum geht es bei dem ersten Beispiel nicht? Ich gebe doch beim initialisieren den konkreten Typ an.
Ich dachte man sollte am besten immer gegen das Interface implementieren?
 
kneitzel

kneitzel

Top Contributor
List ist ein Interface, das bestimmte Methoden vorgibt. Wenn Du gegen dieses Interface programmieren willst, dann musst Du Dich auf dieses Interface beschränken.
Eine Klasse, die das Interface implementiert kann natürlich noch weitere Methoden haben.

Das Beispiel bei Dir ist genau das: List kennt keine Methode addFirst.

Du müsstest also statt dessen z.B. add(int, E) nutzen.
 
L

Lyreex

Aktives Mitglied
Okay, aber wenn ich die Methoden von LinkedList verwenden will, dann darf ich nicht gegen das List Interface implementieren, sondern muss direkt gegen LinkedList implementieren oder?
 
Mart

Mart

Bekanntes Mitglied
Bei einer Vererbung darf eine klasse nur um Funktionen erweitert werden ansonsten wäre die Vererbung relativ sinnlos :D


wenn du die LinkedList erweitern willst um etwas solltest du diese extenden dann hast du auch die ganzen methoden der LinkedList...


willst du deine eigene Liste bauen sollte man das List interface benutzen
 
L

Lyreex

Aktives Mitglied
Alles klar.
Aber macht es dann Sinn trotzdem immer gegen das List Interface zu implementieren oder sollte man direkt gegen die entsprechende Klasse implementieren? Also was wäre so Best Practice?

Mein Gedanke: Wenn ich gegen das List Interface implementiere, dann könnte ich an einer anderen Stelle meine Meinung ändern und einfach ein Objekt von z.B. der LinkedList erstellen und die Elemente von List reinpacken. Dann hätte ich meine LinkedListe mit all ihren Funktionen.
Oder gäbe es dafür einen besseren Ansatz?
 
kneitzel

kneitzel

Top Contributor
Okay, aber wenn ich die Methoden von LinkedList verwenden will, dann darf ich nicht gegen das List Interface implementieren, sondern muss direkt gegen LinkedList implementieren oder?
Wenn Du Methoden verwenden willst, die nicht zu List gehören, dann ist eine Entwicklung gegen List nicht sinnvoll. Du nutzt nur dann ein Interface, wenn es die Möglichkeiten bietet, die du brauchst. Wenn es Deine Anforderungen nicht erfüllt, dann taugt es für diese spezielle Nutzung, die Du vorhast, nichts.

Daher ist immer die Frage, was Du genau brauchst / willst. Und wenn statt .addFirst("abc"); auch ein .add(0, "abc"); Deine Anforderung erfüllt, dann würde List auch wieder gehen.
 
kneitzel

kneitzel

Top Contributor
Alles klar.
Aber macht es dann Sinn trotzdem immer gegen das List Interface zu implementieren oder sollte man direkt gegen die entsprechende Klasse implementieren? Also was wäre so Best Practice?

Mein Gedanke: Wenn ich gegen das List Interface implementiere, dann könnte ich an einer anderen Stelle meine Meinung ändern und einfach ein Objekt von z.B. der LinkedList erstellen und die Elemente von List reinpacken. Dann hätte ich meine LinkedListe mit all ihren Funktionen.
Oder gäbe es dafür einen besseren Ansatz?
Also wenn Du spezielle Dinge brauchst, die List nicht bietet, aber Du nur eine List hast, dann musst Du da mit irgendwas aktiv werden. Da kann das Beschriebene möglich sein. Das bringt Dir aber nicht unbedingt das, was Du willst, denn dann hast Du eine neue Instanz und damit veränderst Du ja nicht die List, die übergeben wurde.

Also ausführlich:
Du übergibst eine List an eine Methode: 1, 2, 3
Da Du nun addFirst machen willst, erzeugst Du eine LinkedList mit den Elementen der List und rufst addFirst(0) auf.
Dann ist die übergebene List immer noch 1, 2, 3 und nur in der Linked List, die Du erzeugt hast, ist jetzt 0, 1, 2, 3 enthalten.

Was wie sinn macht, muss man immer im Detail sehen. Die Java Collections sind aber schon recht gut durchdacht, so dass die meisten Anwendungsfälle durchaus schon bedacht wurden.

Generell solltest Du Daten so modellieren, dass Du alle notwendigen Operationen durchführen kannst. Wie Du die Daten intern hältst ist dabei egal - du solltest es nur sauber kapseln, so dass dies eben nicht nach außen geht. Dann kannst Du es auch jederzeit so ändern, wie Du es brauchst.
 
F

fhoffmann

Top Contributor
Okay, aber wenn ich die Methoden von LinkedList verwenden will, dann darf ich nicht gegen das List Interface implementieren, sondern muss direkt gegen LinkedList implementieren oder?
Schon der Titel deiner Frage ist verwirrend: Eine List hat keine (direkte) Implemnetierung, eine LinkedList schon.
Du solltest begrifflich zwischen der Implementierung einer Klasse und der Benutzung einer Klasse (eines Interfaces) unterscheiden.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
dann komplett selber schreiben und alles neu erfinden ..nix extenden..


bitte wenigstens dann dazu schreibne wie es "richtig" gemacht wird
Nein, neu schreiben muss man auch nichts – man kann LinkedList durchaus intern nutzen.
Vererbung sollte man aber nur nutzen, wenn Klassen dafür explizit vorgesehen sind – und das ist nahezu keine.

Einfaches Beispiel mit Listen: die Liste soll zählen, wie viele Elemente insgesamt hinzugefügt wurden.
Welche Methoden müsstest du jetzt beim extenden von einer beliebigen Listen-Implementation überschrieben und um das zählen erweitern, damit es korrekt funktioniert?
add, addAll, den Konstruktor der eine Collection übergeben bekommt?
 
Mart

Mart

Bekanntes Mitglied
Nein, neu schreiben muss man auch nichts – man kann LinkedList durchaus intern nutzen.
Vererbung sollte man aber nur nutzen, wenn Klassen dafür explizit vorgesehen sind – und das ist nahezu keine.

Einfaches Beispiel mit Listen: die Liste soll zählen, wie viele Elemente insgesamt hinzugefügt wurden.
Welche Methoden müsstest du jetzt beim extenden von einer beliebigen Listen-Implementation überschrieben und um das zählen erweitern, damit es korrekt funktioniert?
add, addAll, den Konstruktor der eine Collection übergeben bekommt?
Man muss ja auch nicht die bereits "fertigen" Methoden überschreiben...


So wie ich Vererbung gelernt habe ist der "absolut banalste Grundsatz der Vererbung" man muss die Klasse erweitern und nicht einschränken..
wenn man jetzt extended und nur 1 Methode zusätzlich hinzufügt sollte es in Ordnung gehen, da man die Klasse von vorher hat PLUS 1 Methode mehr

Das geht jetzt nicht speziell um Listen sondern allgemein um Vererbung
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Was leider beim Lernen von Vererbung meist untergeht ist die erste und wichtigste Regel zu Vererbung: Vererbung ist der falsche Weg. (Ausnahmen bestätigen die Regel)

Vor allem wenn du eine Klasse nur um Funktionen erweitern willst und keine bestehende Funktionalität ändern willst, ist Vererbung der falsche Weg. Grad dann ginge auch einfache Delegation.
 
kneitzel

kneitzel

Top Contributor
Ein Stichwort, das da evtl. erwähnt werden sollte: "composition over inheritance".

Im Buch Effective Java ist es Topic 16.

Das einfach mal um Stoff für Google oder für ein Buch zu nennen.
 
L

LimDul

Top Contributor
Es gibt den schönen Spruch "Composition over Inheritance". In den seltensten Fällen will man wirklich eine Standardklasse wie LinkedList ableiten (bzw. bei LinkedList würde ich sogar sagen, es gibt gar keinen Fall). Sondern man möchte Funktionalität von LinkedList nutzen und ergänzen. Und das ist eher Komposition-

Ein Ableitung - auch wenn das Schlüsselwort extends heißt - ist immer eine Spezialisierung (Das wird z.B. bei CDI mit der Annotation Specialize sehr deutlich).

Eine Ableitung einer Klasse X muss die Funktionalität, die von der Klasse X spezifiziert wird beibehalten. Das heißt, den Rahmen den die Klasse X vorgibt, der darf nicht verlassen werden. Nehmen wir mal eins der klassischen Beispiele:

Java:
public class Circle extends Shape

Jeder Kreis ist ein Shape, das heißt die Klasse Circle erweitert zwar die Klasse Shape, aber sie muss alles was die Klasse Shape kann auch können. Sie kann zwar noch die Dinge, die für Kreise speziell sind, aber eben auch alles aus Shape. Und während jeder Circle ein Shape ist, ist nicht jedes Shape ein Circle. Ergo ist Circle die speziellere Klasse.

Und in der Regel sind die Klassen aus der Standardbibliothek (sofern sie nicht zum ableiten Vorgesehen sind, wie z.B. diverse Abstrakte Listener Klassen) bereits so, dass eine weitere Spezialisierung keinen Sinn ergibt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Unterschied zwischen NormalizedValue und Value Allgemeine Java-Themen 5
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
M Unterschied zwischen Win 7/2008R2 und Win8.1/2012R2? Allgemeine Java-Themen 8
H Gibt es einen großen Unterschied zwischen Java 6 und Java 7? Allgemeine Java-Themen 3
D Exakte Unterschied zwischen diesen Elementen? Allgemeine Java-Themen 5
N Unterschied zwischen "Java" und "Java mit Eclipse" Allgemeine Java-Themen 17
G Hauptthread anhalten / Unterschied zwischen Main-Thread und dialogelement-Thread Allgemeine Java-Themen 2
Lufti Unterschied zwischen Djava.library.path und Class-Path im Manifest? Allgemeine Java-Themen 2
B Unterschied zwischen Klasse und Objekt? Allgemeine Java-Themen 8
B Gibt es einen Unterschied zwischen Java 1.2 und Java 2? Allgemeine Java-Themen 7
J Unterschied zwischen "Debug" und "Run" Allgemeine Java-Themen 16
P Unterschied zwischen Funktion und Methoden Allgemeine Java-Themen 3
O Unterschied zwischen ThreadPoolExecutor und Executor Service Allgemeine Java-Themen 7
O Unterschied zwischen Semaphoren/Lock und ExecutorService Allgemeine Java-Themen 3
I Unterschied zwischen Applet und JApplet Allgemeine Java-Themen 2
R Der Unterschied zwischen 2.1 und 2.10 Allgemeine Java-Themen 2
P Was ist der Unterschied zwischen JSP und Servlet ? Allgemeine Java-Themen 4
S Unterschied zwischen notify() und notifyAll() Allgemeine Java-Themen 2
M Unterschied zwischen // und \\ Allgemeine Java-Themen 6
E Unterschied zwischen Adapterklassen und abstracten Klassen? Allgemeine Java-Themen 5
P Unterschied Java SE und Java EE Allgemeine Java-Themen 2
J Unterschied: Polymorphie und Dynamisches Binden Allgemeine Java-Themen 8
VfL_Freak JDK installieren Unterschied zw. JDK 8_151 und 8_152 Allgemeine Java-Themen 3
T Unterschied Oracle JDK 8u111 8u112 Allgemeine Java-Themen 3
W Unterschied Standalone und Applet Allgemeine Java-Themen 1
O [log4J] Unterschied SocketServer <-> SimpleSocketServer Allgemeine Java-Themen 0
M Unterschied CPU Auslastung Allgemeine Java-Themen 0
N Unterschied Hobby-Codung und Professionelle Softwareentwicklung Allgemeine Java-Themen 5
D Unterschied Vererbung und Polymorphie? Allgemeine Java-Themen 4
G UnterSchied OpenJDK vs JDK Allgemeine Java-Themen 11
G Unterschied MyClass.class vs this Allgemeine Java-Themen 2
H Unterschied EventQueue.invoke... und thread.start() Allgemeine Java-Themen 4
Semox Unterschied bei Thread Erstellung Allgemeine Java-Themen 11
N Unterschied abstract interface und interface Allgemeine Java-Themen 4
G Unterschied Enterprise Anwendung und Web Anwendung Allgemeine Java-Themen 30
Q Unterschied der Logger Allgemeine Java-Themen 9
G Unterschied Long - Int Allgemeine Java-Themen 9
A Unterschied Scanner und Matcher Allgemeine Java-Themen 5
M Unterschied der java.exe des JDK und der JRE Allgemeine Java-Themen 15
K Unterschied Compilierung Eclipse 3.2 und Ant Allgemeine Java-Themen 3
V Unterschied FileOutputStream und FileWriter? Allgemeine Java-Themen 8
B Unterschied: jar <-> konsole Allgemeine Java-Themen 9
G Unterschied abstrakte Klasse und Interface? Allgemeine Java-Themen 3
T abstract - interface Unterschied Allgemeine Java-Themen 22
K Unterschied Core Java / Desktop Allgemeine Java-Themen 12
J Unterschied PrintJob & PrinterJob Allgemeine Java-Themen 11
M Unterschied notify() und notifyAll() Allgemeine Java-Themen 1
N Unterschied Calendar und GregorianCalendar Allgemeine Java-Themen 9
T Unterschied Dämon - Thread (läuft später auf RMI hinaus...) Allgemeine Java-Themen 6
B Unterschied: Java - Java 2 Allgemeine Java-Themen 5
B (String) und toString(), woliegt der Unterschied? Allgemeine Java-Themen 4
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 0
B Schnittstelle zwischen MySQL und Apache Allgemeine Java-Themen 8
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
Kirby.exe Schauen ob ein Kante zwischen Knoten existiert Allgemeine Java-Themen 4
L Schlüsselworte Wie kann ich am Besten ein LocalDate zwischen Anfangs und EndDate checken Allgemeine Java-Themen 10
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
N Kollision zwischen ImageIcon und Rechteck Allgemeine Java-Themen 1
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
B Zufällig zwischen vorgegebenen Zahlen auswählen Allgemeine Java-Themen 6
J Millisekunde zwischen 2 Daten Allgemeine Java-Themen 6
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
J Fahrroute zwischen zwei Punkten finden Allgemeine Java-Themen 1
J Transfer von Integer zwischen zwei Clients - RMI Allgemeine Java-Themen 4
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
T Strings über Bluetooth zwischen PC,µc oder Samrtphone senden und empfangen Allgemeine Java-Themen 0
H RegularExpression zwischen zwei Strings Allgemeine Java-Themen 2
V Input/Output Austausch von Bytes zwischen C# und Java Allgemeine Java-Themen 3
L Kommunikation zwischen C# und Java? Allgemeine Java-Themen 5
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
N Zeitabstand zwischen 2 Daten(Mehrzahl von Datum) Allgemeine Java-Themen 3
O Socket-Unterschiede zwischen Windows und Ubuntu Allgemeine Java-Themen 2
Z Vergleich zwischen int und Object Allgemeine Java-Themen 1
S Eclipse Abhängigkeiten zwischen den Projekten in Eclipse Allgemeine Java-Themen 2
G nervendes Problem mit unterschieden zwischen Javax64 und x86 | je nach Programmbedarf beides nötig Allgemeine Java-Themen 2
S Threads Kommunikation zwischen SocketThread und WorkerThread Allgemeine Java-Themen 11
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
B Unteschiede zwischen Kantenoperatoren Allgemeine Java-Themen 3
A Kommunikation zwischen 2 Jar-dateien Allgemeine Java-Themen 16
X Datentypen Prozentualer Abgleich zwischen 2 Strings (Pattern?) Allgemeine Java-Themen 3
Z zeit zwischen maus drücken und loslassen Allgemeine Java-Themen 7
C Komisches Verhalten zwischen Set und List bei contains Allgemeine Java-Themen 6
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
N Gridbaglayout - Abstände zwischen Komponenten einstellen Allgemeine Java-Themen 2
H Datenaustausch zwischen zwei Java-Programmen Allgemeine Java-Themen 5
C Swing Daten zwischen JTable teilen Allgemeine Java-Themen 6
X Bild im Memory zwischen speichern Allgemeine Java-Themen 11
T Zugriff zwischen Klassen für repaint Allgemeine Java-Themen 7
S Assoziation zwischen 2 klassen Allgemeine Java-Themen 14
V Threads & Pipes Datenaustausch zwischen Threads Allgemeine Java-Themen 2
C Strings zwischen 2 Zeichen auslesen Allgemeine Java-Themen 7
E kommunikation zwischen Fenstern Allgemeine Java-Themen 3
A Differenz zwischen zwei Uhrzeiten Allgemeine Java-Themen 7
S Datenformat zum Austausch zwischen Java und Python? Allgemeine Java-Themen 3
G Interface zwischen 2 Programmierern Allgemeine Java-Themen 10
A java.io-Änderungen zwischen java 1.4 und 1.6 Allgemeine Java-Themen 18
G Zwischen Datei und Verzeichnis unterscheiden. Allgemeine Java-Themen 11
J Unterschiede zwischen normaler und Debug Ausfuehrung? Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben