Heim  >  Artikel  >  Java  >  Zusammenfassung der häufigsten JAVA-Interviewfragen im Jahr 2020 (Sammlung)

Zusammenfassung der häufigsten JAVA-Interviewfragen im Jahr 2020 (Sammlung)

angryTom
angryTomnach vorne
2019-11-11 17:47:172133Durchsuche

Zusammenfassung der häufigsten JAVA-Interviewfragen im Jahr 2020 (Sammlung)

Java-Grundlagen und mehrere „Vergleiche“


1.Collections.sort Sortierung Intern Prinzip

In Java 6 verwenden Arrays.sort() und Collections.sort() MergeSort, aber in Java 7 wird die interne Implementierung durch TimSort ersetzt, das Objekte vergleicht. Die Implementierungsanforderungen sind strenger

2. HashMap-Prinzip, in Java8 vorgenommene Änderungen

In Bezug auf die strukturelle Implementierung ist HashMap ein Array + eine verknüpfte Liste + ein rot-schwarzer Baum (JDK1.8 hinzugefügt). Black-Tree-Teil) Implementierung. HashMap lässt nur zu, dass der Schlüssel eines Datensatzes null ist, und lässt zu, dass der Wert mehrerer Datensätze null ist.

HashMap ist nicht threadsicher. ConcurrentHashMap ist threadsicher. Kollisionen auflösen: Wenn ein Konflikt auftritt, verknüpfen Sie Knoten mit Schlüsselwörtern, die Synonyme in einer einzelnen verknüpften Liste sind. Wenn die Hash-Tabelle m lang ist, definieren Sie ein Zeigerarray T, das aus m Kopfzeigern besteht, und die Knotenadresse i. Der Punkt wird in eine einfach verknüpfte Liste mit T(i) als Kopfzeiger eingefügt. In Java 8 überschreiten die widersprüchlichen Elemente den Grenzwert (8) und die verknüpfte Liste wird durch einen rot-schwarzen Baum ersetzt.

3. Der Unterschied zwischen String und StringBuilder

1) Variabel und unveränderlich: String ist unveränderlich und jedes Mal, wenn „+“ ausgeführt wird, wird ein neues Objekt generiert Daher wird String nicht verwendet, wenn Zeichenfolgen häufig geändert werden, um Speicherplatz zu sparen.

2) Ist es Multithread-sicher: StringBuilder fügt der Methode keine Synchronisationssperren hinzu, daher ist es nicht Thread-sicher. Sowohl StringBuffer als auch String sind threadsicher.

4. Der Unterschied zwischen Vector und Array

1) ArrayList wird standardmäßig um 50 % + 1 erweitert, wenn der Speicher nicht ausreicht, und Vector wird standardmäßig um das 1-fache erweitert .

2) Vector ist Thread-sicher, wird jedoch in den meisten Fällen nicht verwendet, da die Thread-Sicherheit einen höheren Systemaufwand erfordert.

5. Der Unterschied zwischen HashMap und Hashtable

1) Historische Gründe: Hashtable erbt die Dictonary-Klasse, HashMap erbt von abstractMap

2) HashMap erlaubt Null-Schlüssel-Wert-Paare, aber es gibt höchstens ein leeres Objekt, was HashTable nicht zulässt.

3) HashTable ist synchronisiert, während HashMap asynchron ist und effizienter als HashTable

6. Vergleich zwischen ConncurrentHashMap und Hashtable (zwei Threads greifen gleichzeitig auf denselben Eintrag zu In der Kartenkette löscht ein Thread am Ende, und ein anderer Thread durchläuft und sucht vorne und fragt, warum der vorherige Thread den von einem anderen Thread später gelöschten Knoten immer noch korrekt finden kann)

ConcurrentHashMap kombiniert Hashtable und Hashmap Vorteile. Hashtable ist synchronisiert, also threadsicher, während Hashmap die Synchronisierung nicht berücksichtigt. Daher ist Hashmap in Single-Thread-Situationen effizienter. Beim Multithreading von Hashtable können Synchronisationsvorgänge die Korrektheit der Programmausführung sicherstellen. Aber Hashtable ist blockierend und die gesamte Struktur muss jedes Mal gesperrt werden, wenn sie synchron ausgeführt wird.

ConcurrentHashMap ermöglicht die gleichzeitige Ausführung mehrerer Änderungsvorgänge Technologie (ein Array speichert mehrere Objekte, verwendet die Sperren dieser Objekte als separate Sperren und verwendet zufällig eine beliebige Sperre beim Abrufen/Putten). Es verwendet mehrere Sperren, um Änderungen an verschiedenen Teilen der Hash-Tabelle zu steuern. In JDK 1.6 gibt es eine HashEntry-Struktur. Jedes Mal, wenn ein neu hinzugefügter Knoten eingefügt wird, wird er als Kopfknoten der Kette verwendet (wie HashMap implementiert), und jedes Mal, wenn ein Knoten gelöscht wird, werden alle Knoten vor dem Knoten gelöscht Der gelöschte Knoten wird kopiert, um eine neue Kette zu bilden, und der nächste Knoten des vorherigen Knotens des aktuellen Knotens wird auf den nächsten Knoten des aktuellen Knotens verwiesen, sodass nach dem Löschen zwei Ketten vorhanden sind, wodurch sichergestellt wird, dass auch in derselben Kette Kette, ein Thread löscht und der andere. Sie funktionieren alle einwandfrei, wenn der Thread durchlaufen wird, da der durchlaufende Thread weiterhin die ursprüngliche Kette verwenden kann.

In Java8 wird flüchtiger HashEntry zum Speichern von Daten verwendet, und das Tabellenelement wird als Sperre verwendet; aus dem Tabellenarray + einer einseitig verknüpften Liste wird ein rot-schwarzer Baum hinzugefügt. Ein Rot-Schwarz-Baum ist ein spezieller binärer Suchbaum mit den folgenden Merkmalen: 1. Der Knoten ist rot oder schwarz. 2. Der Wurzelknoten ist schwarz. 3. Der Blattknoten ist schwarz. 4. Wenn ein Knoten rot ist, ist es auch der Blattknoten Schwarz 5. Die Anzahl der schwarzen Knoten auf allen Pfaden von einem Knoten zu seinen Nachkommenknoten ist gleich.

7. Was ist der Unterschied zwischen ArrayList und LinkedList?

Der offensichtlichste Unterschied besteht darin, dass die zugrunde liegende Datenstruktur von

ArrrayList ein Array ist und Direktzugriff unterstützt, während die zugrunde liegende Datenstruktur von LinkedList eine verknüpfte Liste ist und dies nicht unterstützt Direktzugriff. Um über einen Index auf ein Element zuzugreifen, beträgt die Zeitkomplexität von ArrayList O(1), während die von LinkedList O(n) ist. LinkedList ist eine doppelt verknüpfte Liste

8. Was ist in Java der Unterschied zwischen Comparator und Comparable?

Die Comparable-Schnittstelle wird zum Definieren der natürlichen Reihenfolge von Objekten verwendet und ist eine Sortierschnittstelle, während Comparator normalerweise zum Definieren einer benutzerdefinierten Reihenfolge verwendet wird und eine Vergleichsschnittstelle ist. Wenn wir die Reihenfolge einer bestimmten Klasse steuern müssen und die Klasse selbst die Sortierung nicht unterstützt (d. h. die Comparable-Schnittstelle nicht implementiert), können wir einen „Komparator dieser Klasse“ erstellen, um die Sortierung durchzuführen. Es gibt immer nur einen Vergleichbaren, es können jedoch mehrere Vergleicher vorhanden sein, um die Reihenfolge der Objekte zu definieren.

9. Was ist eine abstrakte Klasse? Wie unterscheidet es sich von einer Schnittstelle? Warum sollten Sie jemals abstrakte Klassen verwenden?

Abstrakte Klassen beziehen sich auf Klassen, die nicht instanziiert werden dürfen. Eine Klasse kann die Vererbungsbeziehung nur einmal verwenden. Eine Klasse kann jedoch mehrere Schnittstellen implementieren.

Abstrakte Klasse und Schnittstelle spiegeln unterschiedliche Designkonzepte wider. Tatsächlich repräsentiert eine abstrakte Klasse die „Ist-ein“-Beziehung und eine Schnittstelle eine „Wie-ein“-Beziehung

Klassen, die abstrakte Klassen und Schnittstellen implementieren, müssen alle darin enthaltenen Methoden implementieren. Abstrakte Klassen können nicht abstrakte Methoden haben. In der Schnittstelle dürfen keine Implementierungsmethoden vorhanden sein. Aber in Java8 sind statische Standardmethoden in Schnittstellen erlaubt.

Variablen, die in der Schnittstelle definiert sind, sind standardmäßig öffentlich, statisch endgültig und ihr Anfangswert muss angegeben werden, sodass sie in der Implementierungsklasse weder neu definiert noch ihre Werte geändert werden können. Variablen in abstrakten Klassen sind standardmäßig benutzerfreundlich und ihre Werte können in Unterklassen neu definiert oder neu zugewiesen werden.

Wenn eine Unterklasse eine abstrakte Methode in der übergeordneten Klasse implementiert, kann die Sichtbarkeit größer oder gleich der in der übergeordneten Klasse sein, während die Sichtbarkeit der Schnittstellenmethode in der Schnittstellenimplementierungsklasse nur gleich sein kann wie das in der Schnittstelle (öffentlich).

Verwenden Sie abstrakte Klassen zur Wiederverwendung. Reduzieren Sie den Codierungsaufwand und reduzieren Sie die Kopplung.

10. Beschreiben Sie das Überladen und Umschreiben in Java?

Sowohl beim Überladen als auch beim Umschreiben können Sie denselben Namen verwenden, um verschiedene Funktionen zu implementieren. Das Überladen ist jedoch eine Aktivität zur Kompilierungszeit, während das Überschreiben eine Laufzeitaktivität ist. Sie können Methoden in derselben Klasse überschreiben, aber Sie können nur Methoden in Unterklassen überschreiben. Umschreiben muss Vererbung haben

Umschreiben: 1. In Unterklassen können von der Basisklasse geerbte Methoden nach Bedarf umgeschrieben werden. 2. Die überschriebene Methode und die überschriebene Methode müssen denselben Methodennamen, dieselbe Parameterliste und denselben Rückgabetyp haben. 3. Überschreibende Methoden können keine restriktiveren Zugriffsrechte verwenden als die überschriebene Methode.

Bei Überladung sollten die Methodennamen gleich sein, aber die Parametertypen und -nummern sind unterschiedlich und die Rückgabewerttypen können gleich oder unterschiedlich sein. Der Rückgabetyp kann nicht als Kriterium zur Unterscheidung überladener Funktionen verwendet werden.

11. Was ist der Unterschied zwischen Collection und Collections?

Collection ist die grundlegende Schnittstelle im Java-Collection-Framework.

Collections ist eine vom Java-Collection-Framework bereitgestellte Toolklasse, die eine große Anzahl statischer Methoden zum Ausführen oder Zurückgeben enthält Sammlungen.

12. Das Implementierungsprinzip des Polymorphismus in Java

Der sogenannte Polymorphismus bezieht sich auf die Referenz der übergeordneten Klasse, die auf das Unterklassenobjekt verweist, und die Unterklasse wird aufgerufen wenn die Methode aufgerufen wird, und nicht die Implementierung der übergeordneten Klasse. Der Schlüssel zur Implementierung des Polymorphismus liegt in der „dynamischen Bindung“.

13.Welche Methoden sind im Objekt definiert?

clone(), equal(), hashCode(), toString(), notify(), notifyAll(),

wait(), finalize(), getClass()

14.Java-Generika und Typlöschung?

Generika sind parametrisierte Typen. Geben Sie beim Erstellen einer Sammlung den Typ der Sammlungselemente an. Diese Sammlung kann nur Parameter dieses Typs übergeben. Typlöschung: Der vom Java-Compiler generierte Bytecode enthält keine generischen Informationen und wird daher zur Kompilierungszeit gelöscht: 1. Generische Daten werden durch die übergeordnete Klasse der obersten Ebene ersetzt. 2. Entfernt.

15. Nennen Sie 5 neue Funktionen, die in JDK 1.8 eingeführt wurden?

Java 8 ist eine bahnbrechende Version in der Geschichte von Java. Im Folgenden sind die 5 Hauptfunktionen von JDK 8 aufgeführt:

Lambda-Ausdruck ermöglicht die Übergabe anonymer Funktionen Die Objekt-API nutzt die Vorteile moderner Multi-Core-CPUs voll aus und ermöglicht Ihnen das Schreiben sehr prägnanter Datums- und Zeit-APIs. Endlich steht Ihnen eine stabile und einfache Datums- und Zeitbibliothek zur Verfügung, über die Sie Erweiterungsmethoden verwenden können statische und Standardmethoden in der Schnittstelle; Doppelte Annotationen, jetzt können Sie dieselbe Annotation mehrmals für denselben Typ verwenden.

16. Der Zugriffsbereich von öffentlichen, privaten, geschützten und Standardschlüsselwörtern in Java:

Auf „Protected“ kann innerhalb des Pakets und auf Unterklassen außerhalb des Pakets zugegriffen werden, auf „Default“ kann zugegriffen werden nur Zugriff innerhalb desselben Pakets, privat kann nur von derselben Klasse sein

17. Häufig verwendete Datenstrukturen:

Sets, lineare Strukturen (Arrays, Warteschlangen, verknüpft Listen und Stapel), Baumformen Struktur, Diagrammstruktur

18. Welcher Baum wird verwendet, um TreeMap in Java zu implementieren? (Antwort)

TreeMap in Java wird mit rot-schwarzen Bäumen implementiert.

19. Was ist eine anonyme innere Klasse? Wie greife ich auf außerhalb definierte Variablen zu?

Anonyme innere Klassen sind innere Klassen ohne Namen. Sie werden normalerweise verwendet, um das Schreiben von Code zu vereinfachen.

Anonyme innere Klassen können nur auf die endgültigen Variablen der äußeren Klasse zugreifen. Java 8 ist intelligenter: Wenn eine anonyme innere Klasse auf eine lokale Variable zugreift, entspricht die lokale Variable der automatischen Verwendung der endgültigen Änderung.

20. Wie erstelle ich ein Singleton-Muster? Als er über die doppelte Überprüfung sprach, sagte er, dass es nicht threadsicher sei. Wie erstellt man effizient einen Thread-sicheren Singleton?

Das eine geschieht durch Aufzählung und das andere durch statische innere Klasse.

21. Was ist der Unterschied zwischen der poll()-Methode und der remove()-Methode?

poll() und

remove() nehmen beide ein Element aus der Warteschlange, aber poll() gibt leer zurück, wenn das Element nicht abgerufen werden kann, aber remove() Wenn dies fehlschlägt, wird eine Ausnahme ausgelöst.

22. Schreiben Sie einen Code zum Entfernen eines Elements beim Durchlaufen einer ArrayList

Verwenden eines Iterators.

Iterator itr = list.iterator();

while(itr.hasNext()) {if(…) { itr.remove();} }

JVM


1. Wie lädt JVM eine Klasse, welche Methoden gibt es im übergeordneten Delegationsmodell

Klasse Ladeprozess: Laden, Verifizieren (die Rolle der Verifizierungsphase besteht darin, sicherzustellen, dass die im Bytestrom der Klassendatei enthaltenen Informationen den JVM-Spezifikationen entsprechen und der JVM keinen Schaden zufügen), Vorbereitung (die Vorbereitungsphase weist Speicher zu Variablen und legt die Initialisierung von Klassenvariablen fest), Parsen (Der Parsing-Prozess besteht darin, die Symbolreferenz im Konstantenpool durch eine direkte Referenz zu ersetzen) und initialisieren.

Methoden im übergeordneten Delegationsmodell: Elterndelegierung bedeutet, dass eine Klasse, wenn sie eine Klassenladeanforderung erhält, nicht versucht, diese zuerst selbst zu laden, sondern zuerst den übergeordneten Klassenlader findet, um ihn abzuschließen. Wenn der Startklassenlader der obersten Ebene angibt, dass er die Klasse nicht laden kann, versucht die Unterklasse, sie selbst zu laden. Wenn der ursprüngliche Initiator-Loader nicht geladen werden kann, wird er nicht nach unten schauen, sondern eine ClassNotFound-Ausnahme auslösen.

Methoden: Bootstrap-Klassenlader, Erweiterungsklassenlader, Anwendungsklassenlader, benutzerdefinierter Klassenlader. Die Bedeutung besteht darin, zu verhindern, dass mehrere Kopien desselben Bytecodes im Speicher erscheinen.

2. GC-Algorithmus (welche Objekte gelten als recycelbare Objekte, Erreichbarkeitsanalyse), CMS-Sammler

Wie stellt JVM fest, dass ein Objekt recycelbar geworden ist? „Müll“, es gibt im Allgemeinen zwei Methoden: Referenznotation und Root-Suchalgorithmus. Die Referenznotation kann das Problem der Zirkelverweise nicht lösen, daher wird die Wurzelsuche verwendet. Ausgehend von einer Reihe von „GC Roots“-Objekten und der Suche nach unten wird der von der Suche zurückgelegte Pfad als Referenzkette bezeichnet. Wenn es keine Referenzkette zwischen einem Objekt und „GC Roots“ gibt, spricht man von einer nicht erreichbaren Referenz. Objekte, auf die nicht verwiesen werden kann, gelten als wiederverwertbare Objekte.

Mehrere Garbage Collectors: 1. Serial New/Serial Old (seriell), 2. Parrallel New (parallel), 3. Parrallel Scavenge, 4. Parrallel Old, 5. CMS (CMS Collector ist ein Collector, der darauf abzielt um die kürzeste Wiederherstellungspausenzeit zu erhalten. Es handelt sich um einen gleichzeitigen Kollektor, der den Mark-Sweep-Algorithmus verwendet.), 6. G1 (ist ein paralleler und gleichzeitiger Kollektor und kann eine vorhersehbare Sammlung erstellen. Das Pausenzeitmodell basiert im Allgemeinen auf Mark Reinigung und teilweise Replikation)

3 In welche Bereiche ist die JVM unterteilt und was macht jeder Bereich?

1) Methodenbereich (Methode): von allen Threads gemeinsam genutzt. Der Methodenbereich enthält alle Klasseninformationen und statischen Variablen.

2) Heap: Wird von allen Threads gemeinsam genutzt und speichert Objektinstanzen und Arrays. Der Java-Heap ist der Hauptbereich von GC.

3) Stapel: Jeder Thread enthält einen Stapelbereich, der einige lokale Variablen usw. speichert.

4) Programmzähler: Dies ist ein Zeilenindikator für den vom aktuellen Thread ausgeführten Bytecode.

4. Welche Dinge werden in der JVM der neuen Generation, der alten Generation und der persistenten Generation gespeichert?

Die persistente Generierung speichert hauptsächlich Klasseninformationen von Java-Klassen und hat wenig mit den Java-Objekten zu tun, die durch die Garbage Collection gesammelt werden sollen. Alle neu generierten Objekte werden zunächst in der jungen Generation platziert, und die alte Generation speichert Objekte mit langen Lebenszyklen.

5. Speicherüberlauf und Speicherverlust:

Speicherüberlauf: Wenn das Programm Speicher beansprucht, ist nicht genügend Speicher vorhanden Da das Müllobjekt nicht recycelt werden kann, können Sie das Speicheranalysetool verwenden, um Lecks anzuzeigen.

6. Prozesse und Threads:

Ein Prozess ist ein laufendes Programm (Unabhängigkeit, Dynamik, Parallelität), und ein Thread bezieht sich auf den sequentiellen Ausführungsfluss in einem Prozess . Der Unterschied besteht darin: 1. Es wird kein Speicher zwischen Prozessen geteilt. 2. Die Kosten für die Erstellung eines Prozesses für die Ressourcenzuweisung sind viel höher, sodass Multithreading in einer Umgebung mit hoher Parallelität effizienter ist.

7. Serialisierung und Deserialisierung:

Serialisierung bezieht sich auf die Konvertierung von Java-Objekten in Bytesequenzen, und Deserialisierung ist das Gegenteil. Hauptsächlich für die Kommunikation zwischen Java-Threads und die Objektübertragung. Nur Klassenobjekte, die die Serializable- oder Externalizable-Schnittstelle implementieren, können serialisiert werden.

Was ist der Großteil der Länge von int in 8,64-Bit-JVM?

In Java ist die Länge einer Variablen vom Typ int unabhängig von der Plattform ein fester Wert und beträgt immer 32 Bit. Dies bedeutet, dass die Länge des int-Typs in virtuellen 32-Bit- und 64-Bit-Java-Maschinen gleich ist.

9. Was ist der Unterschied zwischen WeakReference und SoftReference in Java?

Es gibt vier Arten von Referenzen in Java. StrongReference, SoftReference, WeakReference und PhantomReference.

StrongReference ist die Standardreferenzimplementierung von Java. Sie bleibt so lange wie möglich in der JVM bestehen.

WeakReference Der Name lässt vermuten, dass es sich um eine schwache Referenz handelt. Wenn das referenzierte Objekt keine starke Referenz mehr in der JVM hat, wird es von GC recycelt

Obwohl sowohl WeakReference als auch SoftReference für die Verbesserung von GC und Speichereffizienz von Vorteil sind, ist WeakReference Sobald die letzte starke Referenz verloren geht, wird sie von GC recycelt und SoftReference behält die Referenz so lange wie möglich bei, bis der JVM der Speicher ausgeht (Garantie einer virtuellen Maschine). Diese Funktion macht

SoftReference sehr geeignet Caching-Anwendung

10. Java-Heap-Space und GC erklären?

Beim Start per Java-Befehl

Wenn ein Java-Prozess erstellt wird, wird ihm Speicher zugewiesen. Ein Teil des Speichers wird zum Erstellen von Heap-Speicherplatz verwendet. Wenn ein Objekt im Programm erstellt wird, wird Speicher aus dem Heap-Speicherplatz zugewiesen. GC ist ein Prozess innerhalb der JVM, der den Speicher ungültiger Objekte für die zukünftige Zuweisung zurückgewinnt.

11. Was ist der Unterschied zwischen Heap und Stack in Java?

Heap und Stack in JVM gehören zu unterschiedlichen Speicherbereichen und werden für unterschiedliche Zwecke verwendet. Der Stapel wird häufig zum Speichern von Methodenrahmen und lokalen Variablen verwendet, während Objekte immer auf dem Heap zugewiesen werden. Der Stapel ist normalerweise kleiner als der Heap und wird nicht von mehreren Threads gemeinsam genutzt, wohingegen der Heap von allen Threads in der gesamten JVM gemeinsam genutzt wird.

Parallelität, Sperre


1.flüchtiges Schlüsselwort, Sperre

Bei gleichzeitiger Programmierung: Atomizitätsprobleme, Sichtbarkeit Probleme, Bestellprobleme.

Das Schlüsselwort volatile kann die Sichtbarkeit gewährleisten, und das Wort kann die Neuordnung von Anweisungen verhindern, aber es kann keine Atomizität garantieren. Die Sichtbarkeit kann nur sicherstellen, dass jedes Mal der neueste Wert gelesen wird, Volatilität kann jedoch nicht die Atomizität von Operationen an Variablen garantieren. Fügen Sie das Schlüsselwort Lock und die Speicherbarriere zur generierten Variablenanweisung hinzu.

Die Lock-Implementierung bietet eine größere Auswahl an Sperrvorgängen als die, die mit synchronisierten Methoden und Anweisungen verfügbar sind, und behandelt Thread-Synchronisierungsprobleme eleganter. Durch die Verwendung von Methoden oder Anweisungsblöcken, die mit „sychronized“ geändert wurden, wird die Sperre automatisch aufgehoben, nachdem der Code ausgeführt wurde, während die Verwendung von „Lock“ erfordert, dass wir die Sperre manuell aufheben

2. MYSQL-allgemeine Optimierung (SQL-Optimierung, Tabellenstrukturoptimierung). usw.)

SQL-Optimierung, Tabellenstrukturoptimierung, Indexoptimierung, Cache-Parameteroptimierung

3. Jedes Mal, wenn Java geändert wird, muss es neu kompiliert und gepackt werden und bereitgestellt. Gibt es eine bessere Möglichkeit

Hot Reloading kann verwendet werden

Welche Methoden gibt es für die Kommunikation zwischen Prozessen?

1) Pipe, 2) Named Pipe, 3) Signal, 4) Nachrichtenwarteschlange, 5) Gemeinsam genutzter Speicher, 6) Speicherzuordnung (zugeordneter Speicher), 7) Semaphor, 8) Socket

5.Synchronized ändert statische Methoden und sperrt die Klasse selbst anstelle der Instanz, und nicht statische Methoden sperren die Instanz.

6. Unter welchen Umständen kommt es zum Stillstand des Betriebssystems?

Der sogenannte Deadlock: bezieht sich auf einen Deadlock, der dadurch verursacht wird, dass mehrere Prozesse während des Betriebs um Ressourcen konkurrieren. Ursache: Konkurrenz um Ressourcen: Wenn mehrere Prozesse im System gemeinsam genutzte Ressourcen nutzen und die Ressourcen nicht ausreichen, um den Bedarf zu decken, führt dies dazu, dass Prozesse um Ressourcen konkurrieren und einen Deadlock verursachen. Die Reihenfolge des Fortschritts zwischen Prozessen ist unzulässig: Die Reihenfolge des Anforderns und Freigebens von Ressourcen ist unangemessen, was ebenfalls zu einem Prozess-Deadlock führt

Vier Bedingungen für einen Deadlock:

1. Bedingung des gegenseitigen Ausschlusses (exklusive Ressourcen verarbeiten) 2. Anforderung und Aufbewahrung (wenn der Prozess aufgrund der Anforderung von Ressourcen blockiert wird, werden die erhaltenen Ressourcen beibehalten) 3. Bedingung des Nichtentzugs (die durch den Prozess erhaltenen Ressourcen werden verwendet). bis zum Ende (Vorher kann es nicht gewaltsam entzogen werden) 4. Zyklisches Warten (zwischen mehreren Prozessen wird eine direkte zyklische Warteressourcenbeziehung gebildet)

8. Wie versteht man verteilte Sperren?

Da in der täglichen Arbeit Online-Server auf mehreren verteilten Servern bereitgestellt werden, stehen wir in verteilten Szenarien häufig vor dem Problem der Datenkonsistenz. Daher müssen wir zur Lösung dieser Fragen verteilte Sperren verwenden.

9. Welche Beziehung besteht zwischen Thread-Synchronisierung und Blockierung? Blockiert die Synchronisierung zwangsläufig? Muss die Blockierung synchron sein?

Ob Threads synchronisiert sind oder nicht, hat nichts mit Blockieren oder Nichtblockieren zu tun. Synchronisierung ist ein Prozess, und Blockieren ist ein Zustand eines Threads. Wenn mehrere Threads mit gemeinsam genutzten Variablen arbeiten, kann es zu Konkurrenz kommen. Zu diesem Zeitpunkt ist eine Synchronisierung erforderlich, um zu verhindern, dass mehr als zwei Threads gleichzeitig in den kritischen Bereich gelangen. Während dieses Vorgangs wird der Thread, der später in den kritischen Bereich eintritt, blockiert und darauf gewartet, dass der Thread, der zuerst eingetreten ist, den kritischen Bereich verlässt Bereich.

10. Was ist der Unterschied zwischen synchron und asynchron?

Der größte Unterschied zwischen synchron und asynchron ist. Der eine muss warten, der andere nicht. Durch die Synchronisierung können Deadlocks und das Lesen schmutziger Daten vermieden werden. Wenn jeder über Änderungsberechtigungen verfügt und eine Datei gleichzeitig ändert, ist es möglich, dass eine Person den Inhalt liest, den eine andere Person gelöscht hat Es tritt ein Fehler auf und die Synchronisierung wird der Reihe nach geändert.

11. Thread-Pool

Gemäß den systemeigenen Umgebungsbedingungen wird die Anzahl der Ausführungsthreads effektiv begrenzt, um die besten Betriebsergebnisse zu erzielen. Threads steuern hauptsächlich die Anzahl der ausgeführten Threads. Threads, die die Anzahl überschreiten, warten in der Warteschlange, warten auf die Ausführung einer Aufgabe und nehmen die Aufgabe dann zur Ausführung aus der Warteschlange

12 . Wie rufe ich die Methode wait() auf? Wenn Block oder Schleife verwenden? Warum?

Die Methode wait() sollte in einer Schleife aufgerufen werden, da andere Bedingungen möglicherweise noch nicht erfüllt sind, wenn der Thread die CPU erhält und mit der Ausführung beginnt. Daher ist es besser, eine Schleife durchzuführen, um zu überprüfen, ob die Bedingungen müssen vor der Verarbeitung erfüllt sein.

Wait(), notify() und notifyall() sind Methoden zur Synchronisationssteuerung, die von der Klasse java.lang.Object für Threads bereitgestellt werden, um die Kommunikation zwischen Threads zu implementieren. Warten oder aufwachen

13. Mehrere Methoden zum Implementieren von Threads

(1) Erben Sie die Thread-Klasse und schreiben Sie die Ausführungsfunktion neu

(2) Implementieren Sie die Runnable-Schnittstelle und schreiben Sie die Ausführungsfunktion neu

(3) Implementieren Sie die Callable-Schnittstelle und schreiben Sie die Aufruffunktion neu

14. Was ist falsches Teilen in einer Multithread-Umgebung?

Pseudo-Sharing ist ein bekanntes Leistungsproblem in Multithread-Systemen (jeder Prozessor verfügt über seinen eigenen lokalen Cache). Das Cache-System speichert Daten in Einheiten von Cache-Zeilen. Eine Cache-Zeile ist eine ganzzahlige Potenz von 2 aufeinanderfolgenden Bytes, typischerweise 32–256 Bytes. Die gebräuchlichste Cache-Zeilengröße beträgt 64 Byte. Wenn mehrere Threads unabhängige Variablen ändern und diese Variablen dieselbe Cache-Zeile verwenden, wirken sie sich unbeabsichtigt gegenseitig auf die Leistung aus. Dies ist eine falsche gemeinsame Nutzung.

Netzwerk, Datenbank


1. Wie gewährleistet TCP eine zuverlässige Übertragung? Drei-Wege-Handshake-Prozess?

Bei einer TCP-Verbindung muss der Datenstrom in der richtigen Reihenfolge an die andere Partei übermittelt werden. Die Zuverlässigkeit von TCP wird durch Sequenznummerierung und Bestätigung (ACK) erreicht. TCP-Verbindungen werden mit einem Drei-Wege-Handshake initialisiert. Der Zweck des Drei-Wege-Handshakes besteht darin, die Sequenznummern und Bestätigungsnummern beider Parteien zu synchronisieren und Informationen zur TCP-Fenstergröße auszutauschen. Das erste Mal bedeutet, dass der Client die Verbindung initiiert; das zweite Mal bedeutet, dass der Server die Anfrage des Clients erhalten hat;

2. Welche Befehle werden unter Linux häufig verwendet?

1. Mit dem Befehl cd wird das Verzeichnis gewechselt. cd / Gehe zum Stammverzeichnis cd ~ Gehe zum Benutzerverzeichnis

2. Der Befehl ls wird verwendet, um den Inhalt des Verzeichnisses anzuzeigen.

3. Der cp-Befehl wird verwendet, um die Datei cp

4.mv-Befehl mv t.txt Document zu kopieren, verschiebt die Datei t.txt in das Verzeichnis Document.

3. Welche sind die am häufigsten verwendeten Hash-Algorithmen?

1. Additiver Hash: Der sogenannte additive Hash besteht darin, die Eingabeelemente einzeln hinzuzufügen, um das Endergebnis zu bilden.

2. Bitoperations-Hash: Diese Art von Hash-Funktion mischt die Eingabeelemente vollständig durch die Verwendung verschiedener Bitoperationen (üblicherweise Verschiebung und XOR)

3. Multiplikations-Hash: 33 *Hash + Schlüssel. charAt(i)

4. Was ist konsistentes Hashing?

Das Entwurfsziel besteht darin, das Hot-Spot-Problem im Internet zu lösen. Der konsistente Hash-Algorithmus schlägt vier Definitionen vor, um die Qualität des Hash-Algorithmus in der sich dynamisch ändernden Cache-Umgebung zu bestimmen: 1, Balance (Balance). ) 2. Monotonie (Monotonie) 3. Dispersion (Spread) 4. Load (Load)

5. Was sind die Paradigmen in der Datenbank?

Erste Normalform – Tabellen in der Datenbank (alle Feldwerte) sind unteilbare atomare Datenelemente.

Zweite Normalform – Jede Spalte in der Datenbanktabelle bezieht sich auf den Primärschlüssel und kann nicht nur auf einen bestimmten Teil des Primärschlüssels bezogen werden.

Dritte Normalform – Jede Datenspalte in der Datenbanktabelle steht in direktem Zusammenhang mit dem Primärschlüssel und kann nicht indirekt in Beziehung gesetzt werden. Durch die Normalisierung soll die Datenredundanz reduziert werden.

6. Wie ist der Index in der Datenbank aufgebaut? Unter welchen Umständen ist es sinnvoll, einen Index zu erstellen?

Die Struktur des Index in der Datenbank ist eine sortierte Datenstruktur. Der Datenbankindex wird durch B-Baum und deformierten B+-Baum implementiert. Unter welchen Umständen ist es nicht geeignet, einen Index zu erstellen: 1. Für Spalten, die bei Abfragen nur selten verwendet oder referenziert werden; für Spalten, die als Bild-, Text- und Bit-Datentypen definiert sind größer als die Abrufleistung.

Je nach den systemeigenen Umgebungsbedingungen wird die Anzahl der Ausführungsthreads effektiv begrenzt, um die besten Betriebsergebnisse zu erzielen. Threads steuern hauptsächlich die Anzahl der ausgeführten Threads. Threads, die die Anzahl überschreiten, warten in der Warteschlange, warten auf die Ausführung einer Aufgabe und nehmen die Aufgabe dann zur Ausführung aus der Warteschlange

7 . Wird unten im gleichzeitigen Paket verwendet. Was?

java.util.concurrent, java.util.concurrent.atomic und java.util.concurrent.lock

8. Welche Datenbanken werden häufig verwendet? Haben Sie jemals Redis verwendet?

MySQL, SQL Server, Oracle-Datenbank.

9. Welche Open-Source-Protokolle kennen Sie?

GPL (GNU General Public License): GNU General Public License

LGPL (GNU Lesser General Public License): GNU Lesser General Public License

BSD

(Berkeley Software Distribution): Berkeley Software Distribution-Lizenzvereinbarung

MIT (Massachusetts Institute of Technology): Der Name MIT kommt von MIT

Apache (Apache-Lizenz): Apache-Lizenz

MPL (Mozilla Public License): Mozilla Public License

10. Bei der Formularübermittlung besteht der Unterschied zwischen Get und Post

1. Get erhält Informationen vom Server und Post überträgt Informationen an den Server

2. Die von get übertragene Datenmenge ist relativ gering und Post kann größer sein

3. Die Sicherheit von get ist relativ niedrig

11. Was ist der Unterschied zwischen TCP-Protokoll und UDP-Protokoll? (Antwort Antwort)

Die Abkürzung TCP (Transfer Control Protocol) ist ein verbindungsorientiertes Protokoll, das die Übertragung des Datenstroms gewährleistet. Vor der Übertragung des Datenstroms richten beide Parteien zunächst einen virtuellen Kommunikationskanal ein. Daten können mit wenigen Fehlern übertragen werden.

Die Abkürzung für UDP (User DataGram Protocol) ist ein verbindungsloses Protokoll. Bei der Verwendung von UDP zur Datenübertragung ist jedes Datensegment eine unabhängige Information, einschließlich der vollständigen Quelladresse und des Ziels Daher kann nicht garantiert werden, ob es das Ziel erreichen kann, wie lange es dauert, bis es das Ziel erreicht, und ob die Integrität des Inhalts gewährleistet ist.

TCP benötigt also mehr Zeit für den Verbindungsaufbau als UDP. Im Vergleich zu UDP bietet TCP eine höhere Sicherheit und Zuverlässigkeit.

Es gibt keine Begrenzung für die Größe der TCP-Protokollübertragung. Sobald die Verbindung hergestellt ist, können beide Parteien eine große Datenmenge in einem bestimmten Format übertragen, während UDP ein unzuverlässiges Protokoll mit einer Größenbeschränkung ist und dies nicht möglich ist 64 KB gleichzeitig überschreiten

Das obige ist der detaillierte Inhalt vonZusammenfassung der häufigsten JAVA-Interviewfragen im Jahr 2020 (Sammlung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jianshu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen