![Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 9 - 1](https://cdn.codegym.cc/images/article/2d950cca-d021-4495-91fd-57725c5895b2/800.jpeg)
Sammlungen
84. Erzählen Sie uns etwas über Iteratoren und wie sie verwendet werden
Sammlungen sind ein Lieblingsthema in jedem Java-Entwicklerinterview. Bei der Beantwortung von Fragen zur Sammlungshierarchie sagen Kandidaten oft, dass diese mit der Sammlungshierarchie beginnt . Aber das ist nicht so. Eine Ebene darüber gibt es eine weitere Schnittstelle: Iterable . Diese Schnittstelle besteht aus der Methode iterator() , mit der Sie auf das Iterator- Objekt für die aktuelle Sammlung zugreifen können. Und was genau ist dieses Iterator- Objekt? Das Iterator- Objekt bietet die Möglichkeit, sich durch eine Sammlung zu bewegen und über ihre Elemente zu iterieren, und der Benutzer muss die spezifischen Implementierungsdetails der Sammlung nicht kennen. Mit anderen Worten, es ist eine Art Zeiger auf die Elemente der Sammlung, als ob es einen Blick in eines von ihnen werfen würde. Der Iterator verfügt über Methoden wie:-
hasNext() – gibt true zurück , wenn die Iteration ein anderes Element enthält (diese Methode informiert Sie, wenn Sie das Ende der Sammlung erreicht haben);
-
next() – gibt das nächste Element in der Iteration zurück. Wenn keine vorhanden ist, wird eine NoSuchElementException ausgelöst. Das heißt, bevor Sie diese Methode verwenden, ist es am besten, die Methode hasNext() zu verwenden, um sicherzustellen, dass ein nächstes Element vorhanden ist.
-
remove() – entfernt das letzte mit der next()- Methode empfangene Element aus der Sammlung . Wenn next() noch nie aufgerufen wurde, führt der Aufruf von remove () dazu, dass eine IllegalStateException geworfen wird.
-
forEachRemaining(<Consumer>) – führt die übergebene Aktion für jedes Element der Sammlung aus (diese Methode erschien in Java 8).
List<String> list = new ArrayList<>();
list.add("Hello ");
list.add("World, ");
list.add("It's ");
list.add("Amigo!");
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
iterator.next();
iterator.remove();
}
System.out.println(list.size());
Die Konsole zeigt Folgendes an:
iterator.forEachRemaining(x -> System.out.print(x));
Sobald wir dies jedoch tun, ist der Iterator für die weitere Verwendung unbrauchbar: Er hat die gesamte Liste durchlaufen und ein gewöhnlicher Iterator verfügt über keine Methoden zum Rückwärtsiterieren. Und das ist ein schöner Einstieg in die Diskussion von LinkedList , insbesondere seiner listIterator() -Methode, die einen erweiterten Iteratortyp zurückgibt: ListIterator . Zusätzlich zu den Methoden eines regulären (Standard-)Iterators verfügt dieser Typ über Folgendes:
-
add(<Element>) – fügt der Liste ein neues Element hinzu;
-
hasPrevious() – gibt true zurück , wenn sich ein Element vor dem nächsten Element befindet (wenn es ein vorheriges Element gibt);
-
nextIndex() – gibt den Index des nächsten Elements zurück;
-
previous() – gibt das vorherige Element zurück (das vor dem nächsten Element);
-
previousIndex gibt den Index des vorherigen Elements zurück.
-
set(<Element>) – ersetzt das letzte von next() oder previous() zurückgegebene Element .
![Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 9 - 2](https://cdn.codegym.cc/images/article/248c3c7a-1dc4-4daa-9632-f9af82a832a0/512.jpeg)
85. Welche Sammlungshierarchie gibt es im Java Collection Framework?
In Java gibt es zwei Sammlungshierarchien. Die erste Hierarchie ist die Collection-Hierarchie, die folgenden Aufbau hat:![Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 9 - 3](https://cdn.codegym.cc/images/article/d3160226-1d31-453a-af4c-ab33d6f0c08f/800.jpeg)
-
Set ist eine Schnittstelle, die eine Menge beschreibt, eine Datenstruktur, die ungeordnete, eindeutige (sich nicht wiederholende) Elemente enthält. Diese Schnittstelle verfügt über einige Standardimplementierungen: TreeSet , HashSet und LinkedHashSet .
-
Liste ist eine Schnittstelle, die eine Datenstruktur beschreibt, die eine geordnete Folge von Objekten speichert. Objekte in einer Liste können über ihren Index in der Liste eingefügt und entfernt werden (wie ein Array, aber mit dynamischer Größenänderung). Diese Schnittstelle verfügt auch über einige Standardimplementierungen: ArrayList , Vector ( veraltet und nicht tatsächlich verwendet ) und LinkedList .
-
Queue ist eine Schnittstelle, die eine Datenstruktur beschreibt, die Elemente in einer FIFO-Warteschlange (First In First Out) speichert . Diese Schnittstelle verfügt über die folgenden Standardimplementierungen: LinkedList (das stimmt, sie implementiert auch Queue ) und PriotityQueue .
![Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 9 - 4](https://cdn.codegym.cc/images/article/4e02c9d0-56b7-46a6-804d-ef2018ba2ea9/800.jpeg)
![Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 9 - 5](https://cdn.codegym.cc/images/article/15e3c49f-dbf5-4dde-a62f-77c3041eeff0/512.jpeg)
86. Wie ist die interne Struktur einer ArrayList?
Eine ArrayList ähnelt einem Array, kann jedoch dynamisch erweitert werden. Was bedeutet das? Unter der Haube verwendet ArrayList ein gewöhnliches Array, dh es speichert seine Elemente in einem internen Array, dessen Standardgröße 10 Zellen beträgt. Sobald das interne Array voll ist, wird ein neues Array erstellt. Die Größe des neuen Arrays wird durch diese Formel bestimmt:<size of the current array> * 3 / 2 + 1
Wenn also die Größe unseres Arrays 10 beträgt, beträgt die Größe des neuen Arrays: 10 * 3 / 2 + 1 = 16. Dann werden alle Werte aus dem ursprünglichen (alten) Array mithilfe der integrierten Funktion hineinkopiert System.arraycopy()- Methode und das ursprüngliche Array wird gelöscht. Kurz gesagt: Auf diese Weise implementiert ArrayList die dynamische Größenänderung. Betrachten wir die beliebtesten ArrayList- Methoden: 1. add(<Element>) – fügt ein Element am Ende des Arrays (in der letzten leeren Zelle) hinzu, nachdem zunächst überprüft wurde, ob im Array eine verfügbare Zelle vorhanden ist. Wenn nicht, wird ein neues Array erstellt und die Elemente werden hineinkopiert. Die zeitliche Komplexität dieser Operation beträgt O(1). Es gibt eine ähnliche add(<Index>, <Elelement>) -Methode. Es fügt ein Element nicht am Ende der Liste (Array) hinzu, sondern an der spezifischen Zelle, die durch den als Argument eingegebenen Index angegeben wird. In diesem Fall variiert die zeitliche Komplexität je nachdem, wo Sie Folgendes hinzufügen:
- Wenn das Hinzufügen nahe am Anfang der Liste liegt, liegt die Zeitkomplexität nahe bei O(N), da alle Elemente, die sich rechts vom neuen befinden, um eine Zelle nach rechts verschoben werden müssen.
- Wenn das Element in der Mitte eingefügt wird, ist es O(N/2), da wir nur die Hälfte der Listenelemente um eine Zelle nach rechts verschieben müssen.
87. Wie ist die interne Struktur einer LinkedList?
Eine ArrayList enthält Elemente im internen Array, eine LinkedList speichert sie jedoch in einer doppelt verknüpften Liste. Das bedeutet, dass jedes Element einen Link zum vorherigen Element und zum nächsten Element enthält. Das erste Element stellt keinen Link zu einem vorherigen Element her (schließlich ist es das erste). Es wird auch als Kopf der Liste betrachtet und das LinkedList- Objekt weist einen direkten Verweis darauf auf. Ebenso verfügt das letzte Element nicht über das nächste Element, da es das Ende der Liste darstellt. Das LinkedList- Objekt verweist auch direkt darauf. Dies bedeutet, dass die zeitliche Komplexität des Zugriffs auf den Anfang oder das Ende einer Liste O(1) beträgt.![Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 9 - 6](https://cdn.codegym.cc/images/article/6e66c6e1-827e-49fc-ac5d-e1d0a84d15fd/800.jpeg)
![Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 9 - 7](https://cdn.codegym.cc/images/article/3dec5d99-31ea-4e3a-a9f4-65a345d706d0/512.jpeg)
- Liegt es nahe am Kopf oder Ende, nähert sich die Operation O(1), da es eigentlich nicht notwendig ist, über die Elemente zu iterieren.
- Wenn es nahe an der Mitte liegt, haben wir O(N/2), da die Methode gleichzeitig vom Kopf und vom Ende aus sucht, bis das gewünschte Element gefunden ist.
![Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 9 - 8](https://cdn.codegym.cc/images/article/b1d6f029-25a3-44b9-88e1-a2c2317aa1c2/512.jpeg)
88. Wie ist die interne Struktur einer HashMap?
Dies ist möglicherweise eine der beliebtesten Interviewfragen, die Java-Entwicklerkandidaten gestellt werden. Eine HashMap arbeitet mit Schlüssel-Wert-Paaren . Wie werden sie in der HashMap selbst gespeichert? Eine HashMap verfügt über ein internes Array von Knoten:Node<K,V>[] table
Standardmäßig beträgt die Größe des Arrays 16 und verdoppelt sich jedes Mal, wenn es mit Elementen gefüllt wird (d. h. wenn der LOAD_FACTOR erreicht wird; er gibt den Schwellenwert an, wie voll das Array werden kann – standardmäßig ist er 0,75 ). . Jeder der Knoten speichert einen Hash des Schlüssels, den Schlüssel, einen Wert und eine Referenz auf das nächste Element: ![Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 9 - 9](https://cdn.codegym.cc/images/article/641235f1-28eb-4c38-b48b-557111fd2ce1/512.jpeg)
- Die Zelle ist leer – in diesem Fall wird der neue Knotenwert darin gespeichert.
- Die Zelle ist nicht leer – in diesem Fall werden die Werte der Schlüssel verglichen. Wenn sie gleich sind, überschreibt der neue Knotenwert den alten; Wenn nicht gleich, wird auf den nächsten zugegriffen und sein Schlüssel verglichen ... Und so weiter, bis der neue Wert entweder einen alten Wert überschreibt oder wir das Ende der einfach verknüpften Liste erreichen und den neuen Wert dort als speichern letztes Element.
![Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 9 - 10](https://cdn.codegym.cc/images/article/b5a20c3a-5110-403e-83c9-b2dc54cd79f6/512.jpeg)
GO TO FULL VERSION