it-swarm.com.de

Eine LinkedList in Java deklarieren

Ich lerne immer, wenn wir eine Sammlung deklarieren, die wir tun sollten, Interface ob = new Class(). Wenn ich zum Beispiel eine LinkedList verwenden möchte, mache ich List ob = new LinkedList(), aber dann kann ich nicht auf alle Methoden von LinkedList zugreifen. Ist LinkedList ob = new LinkedList() 100% richtig? 

9
Márcio Duarte

Ist LinkedList ob = new LinkedList () nicht 100% korrekt?

Nun, ich würde die Verwendung des generischen Formulars vorschlagen, aber sicher - wenn Sie Funktionalität verwenden möchten, die spezifisch ist für LinkedList, müssen Sie die Variable entsprechend deklarieren.

Möglicherweise möchten Sie überprüfen, ob die Schnittstellen Deque<E> oder Queue<E> das haben, was Sie möchten. Wenn dies der Fall ist, verwenden Sie diejenigen, die der Idee entsprechen, zu beschreiben, was Sie brauchen, und nicht, welche Implementierung Sie verwenden.

11
Jon Skeet

Ja,

LinkedList<...> items = new LinkedList<...>();

ist vollkommen korrekt, wenn Sie wissen, dass items von Methoden von LinkedList<T> abhängt, die nicht in der List<T>-Schnittstelle erfasst werden.

6
ruakh

Sie sollten immer versuchen, die Deklaration auf der höchsten Ebene möglich zu halten, was bedeutet, dass Sie auf der höchsten Ebene aufhören sollten, die alle erforderlichen Funktionen bietet: Wenn List-Methoden nicht ausreichen, sind Sie mit Ihrer LinkedList-Deklaration.

4
michele b

die Regel "immer Code an Schnittstellen" muss mit einiger Flexibilität angenommen werden. was Sie vorschlagen, ist in Ordnung, und als Sie zu dem Schluss gekommen sind, die einzige Option.

als Randbemerkung ist das Codieren in konkrete Klassen wie diese von den meisten JVMs schneller. Die Entscheidung, ob es sich lohnt, die Performance zu verletzen, ist schwer zu entscheiden. 

3

Wenn Sie tatsächlich Methoden verwenden müssen, die sich nicht in der List-Schnittstelle befinden, stimmt die Verwendung der LinkedList-API mit Sicherheit nicht. Die allgemeine Regel der Programmierung für das Listen-Interface erkennt, dass 1) diese Methoden ziemlich selten benötigt werden und 2) nach Erfahrung der meisten Benutzer die Wahrscheinlichkeit, dass ich die Liste sortiere und/oder viel zufällig benutze, wahrscheinlicher ist zugreifen und entscheiden, zu einer ArrayList zu wechseln, als ich eine der Methoden brauche, die nur LinkedList hat.

Es kann auch sein, dass Sie die Queue-Oberfläche programmieren, wenn Sie feststellen, dass List Ihnen nicht das gibt, was Sie brauchen.

3
Affe

LinkedList ist generisch. Sie sollten tun:

LinkedList<String> linkedList = new LinkedList<String>();

(oder was auch immer Sie dort anstelle von String speichern müssen)

2
Eugene Feingold

Nicht genau 100% korrekt.

Eine bevorzugte Methode zum Deklarieren einer Sammlung ist das Einschließen des Datentyps, den sie enthält. Für Ihr Beispiel wäre es also LinkedList<Integer> ob = new LinkedList<Integer>();.

1
Makoto

Nein. Das wäre falsch, wenn er später seine Implementierung von einer verknüpften Liste in eine andere Implementierung des Listentyps ändern möchte, wird er einen Fehler machen. Verwenden Sie daher die Deklaration auf Schnittstellenebene.

1
Punith Raj

sie können immer noch Zugriff auf LinkedList-Methoden haben, indem Sie List verwenden. Alles, was Sie tun müssen, ist beispielsweise cast einzugeben

((LinkedList)ob).add()

Bei der Verwendung der generischen Liste und nicht bei LinkedList ist es wichtig, dass für den Fall, dass Sie einfach den Typ der verwendeten Listen ändern (z. B. doppelt verknüpfte Liste), Ihr Programm weiterhin funktioniert. Generics sollen Ihren Code vereinfachen, damit er portabler und "änderbarer" wird.

0
John Demetriou

Ich kann Ihnen nicht immer empfehlen, Generika zu verwenden ..... Coz Manchmal müssen Sie verschiedene Objekte wie hier verpacken ....

          String str="a string";
          boolean status=false;

          LinkedList ll = new LinkedList();
          ll.add(str);
          ll.add(status);

In einigen Situationen, wie bei RMI, können Sie nur serialisierte Daten senden ..... und Sie möchten ein Klassenobjekt senden (das unserialisiert wird) ....... Dort können Sie die Member der Klasse umschließen ( primitives) in einer LinkedList übergeben und das Objekt als Ganzes übergeben ....... keine Sorge wegen der großen Anzahl von Argumenten ...... Betrachten Sie zB:

       public Class DataHouse
       {
             public int a;
             public String str;
             .
             .
             .
       }

Jetzt müssen Sie irgendwo die Objekte übergeben .... Sie können Folgendes tun ....

             DataHouse dh =new DataHouse();
             LinkedList ll = new LinkedList();
             ll.add(dh.a);
             ll.add(dh.str);

             // Now the content is serialized and can pass it as a capsuled data......
0
Arjun K P