Heim > Java > JavaInterview Fragen > Teilen häufiger Fragen zu Java-Schlüsselinterviews

Teilen häufiger Fragen zu Java-Schlüsselinterviews

王林
Freigeben: 2020-09-30 16:18:01
nach vorne
2807 Leute haben es durchsucht

Teilen häufiger Fragen zu Java-Schlüsselinterviews

1. Was ist Java Virtual Machine? Warum wird Java als „plattformunabhängige Programmiersprache“ bezeichnet?

(Empfehlungen für weitere verwandte Interviewfragen: Java-Interviewfragen und -antworten)

Die Java Virtual Machine ist ein virtueller Maschinenprozess, der Bytecode-Dateien (.class) ausführt. . Das Java-Quellprogramm (.java) wird vom Compiler in eine Bytecode-Datei (.class) kompiliert. Anschließend wird die Bytecode-Datei von der Java Virtual Machine in Maschinencode interpretiert (der Maschinencode verschiedener Plattformen ist unterschiedlich). Verwenden Sie Maschinencode, um Hardware und Betriebssysteme zu betreiben. Da unterschiedliche Plattformen mit unterschiedlichen JVMs ausgestattet sind, können sie dieselbe .class-Datei in den für unterschiedliche Plattformen erforderlichen Maschinencode interpretieren. Gerade wegen der Existenz von JVM wird Java als plattformunabhängige Programmiersprache bezeichnet.

2. Was ist der Unterschied zwischen JDK und JRE?

Java Development Kit (JDK) ist ein vollständiges Java-Softwareentwicklungspaket, einschließlich JRE, Compiler und anderen Tools (wie JavaDoc, Java-Debugger), mit dem Entwickler Java-Anwendungen entwickeln, kompilieren und ausführen können. Java Runtime Environment (JRE). Es umfasst eine Java Virtual Machine, eine Java-Kernklassenbibliothek und Supportdateien. Es enthält keine Entwicklungstools (JDK), Compiler, Debugger und andere Tools.

3. Was bedeutet das Schlüsselwort „statisch“? Ist es möglich, eine private oder statische Methode in Java zu überschreiben?

Das Schlüsselwort „static“ gibt an, dass auf eine Mitgliedsvariable oder Mitgliedsmethode ohne eine Instanzvariable der Klasse, zu der sie gehört, zugegriffen werden kann.
Statische Methoden in Java können nicht überschrieben werden, da Methodenüberschreibungen auf einer dynamischen Bindung zur Laufzeit basieren, während statische Methoden zur Kompilierzeit statisch gebunden werden. Statische Methoden beziehen sich nicht auf eine Instanz der Klasse und sind daher konzeptionell nicht anwendbar. Private Methoden können in Java nicht überschrieben werden, da private Variablen und Methoden nur in der aktuellen Klasse verwendet werden können. Wenn andere Klassen die aktuelle Klasse erben, können sie nicht auf private Variablen oder Methoden zugreifen und diese natürlich nicht überschreiben.

4. Ist es möglich, in einer statischen Umgebung auf nicht statische Variablen zuzugreifen?

Statische Variablen gehören zu Klassen in Java und ihre Werte sind in allen Instanzen gleich. Wenn eine Klasse von der Java Virtual Machine geladen wird, werden statische Variablen initialisiert. Wenn Ihr Code versucht, auf nicht statische Variablen zuzugreifen, ohne eine Instanz zu verwenden, meldet der Compiler einen Fehler, da diese Variablen noch nicht erstellt wurden und keiner Instanz zugeordnet sind.

5.Welche Datentypen werden von Java unterstützt? Was ist eine automatische Auspackbox?

Java unterstützt zwei Datentypen: Einer ist der Basisdatentyp, einschließlich Byte, Char, Short, Boolean, Int, Long, Float, Double; der andere ist der Referenztyp: wie String usw., die tatsächlich sind Referenz: Der virtuelle Stapel in der JVM speichert die Adresse des Objekts, und das erstellte Objekt befindet sich tatsächlich im Heap. Der Prozess des Findens des Objekts im Heap über die Adresse ist ein Referenztyp. Autoboxing ist die Konvertierung des Java-Compilers zwischen Basisdatentypen und entsprechenden Objektverpackungstypen, d. h. int wird in Integer konvertiert. Beim automatischen Unboxing wird Integer durch Aufrufen seiner Methode in int konvertiert.

6.Was bedeuten Methodenüberschreibung und Methodenüberladung in Java?

Methodenüberladung in Java tritt auf, wenn zwei oder mehr Methoden in derselben Klasse denselben Methodennamen, aber unterschiedliche Parameter haben. Überschreiben ist eine Manifestation des Polymorphismus in einer Klasse. Das Überschreiben von Methoden bedeutet, dass die Unterklasse die Methode der übergeordneten Klasse neu definiert. Methodenüberschreibungen müssen denselben Methodennamen, dieselbe Parameterliste und denselben Rückgabetyp haben. Ein Overrider darf den Zugriff auf die Methoden, die er überschreibt, nicht einschränken. In Java können Unterklassen die Methoden der übergeordneten Klasse erben, ohne dass dieselben Methoden neu geschrieben werden müssen. Aber manchmal möchte die Unterklasse die Methode der übergeordneten Klasse nicht unverändert erben, sondern bestimmte Änderungen vornehmen, sodass das Methodenumschreiben verwendet wird. Das Überschreiben von Methoden wird auch als Methodenüberschreiben bezeichnet.

7.Was ist eine Konstruktormethode in Java? Was ist Konstruktorüberladung? Was ist ein Kopierkonstruktor?

Wenn ein neues Objekt erstellt wird, wird der Konstruktor aufgerufen. Jede Klasse verfügt über Konstruktormethoden. Wenn der Programmierer keinen Konstruktor für die Klasse bereitstellt, erstellt der Java-Compiler einen Standardkonstruktor für die Klasse. Konstruktorüberladung und Methodenüberladung in Java sind sehr ähnlich. Für eine Klasse können mehrere Konstruktoren erstellt werden. Jeder Konstruktor muss über eine eigene eindeutige Parameterliste verfügen. Java unterstützt keine Kopierkonstruktoren. Wenn Sie den Konstruktor nicht selbst schreiben, erstellt Java keinen Standardkopiekonstruktor.

8. Unterstützt Java Mehrfachvererbung?

Klassen in Java unterstützen keine Mehrfachvererbung, sondern nur Einzelvererbung (d. h. eine Klasse hat nur eine übergeordnete Klasse). Allerdings unterstützen Schnittstellen in Java die Mehrfachvererbung, d. h. eine Unterschnittstelle kann mehrere übergeordnete Schnittstellen haben. (Die Funktion einer Schnittstelle besteht darin, die Funktionen eines Objekts zu erweitern. Eine Unterschnittstelle erbt mehrere übergeordnete Schnittstellen, was darauf hinweist, dass die Unterschnittstelle mehrere Funktionen erweitert. Wenn eine Klasse die Schnittstelle implementiert, erweitert die Klasse die entsprechenden Funktionen.)

9. Was ist der Unterschied zwischen Schnittstelle und abstrakter Klasse?

Auf der Designebene ist Abstraktion die Abstraktion von Klassen und ein Vorlagendesign. Schnittstellen sind die Abstraktion von Verhalten und eine Spezifikation von Verhalten.

Java bietet und unterstützt die Erstellung abstrakter Klassen und Schnittstellen. Ihre Implementierungen haben etwas gemeinsam, aber die Unterschiede sind:

Alle Methoden in der Schnittstelle sind implizit abstrakt. Eine abstrakte Klasse kann sowohl abstrakte als auch nicht abstrakte Methoden enthalten. Eine Klasse kann jedoch nur eine abstrakte Klasse erben In diesem Fall müssen Klassen auch als abstrakte Klassen deklariert werden. Abstrakte Klassen können Schnittstellen implementieren, ohne dass Schnittstellenmethodenimplementierungen in Java-Schnittstellen deklariert werden. Abstrakte Klassen können nicht endgültige Variablen enthalten; Mitgliedsfunktionen in Java-Schnittstellen sind standardmäßig öffentlich. Mitgliedsfunktionen abstrakter Klassen können privat, geschützt oder öffentlich sein; Schnittstellen sind absolut abstrakt und können nicht instanziiert werden. Eine abstrakte Klasse kann nicht instanziiert werden, sie kann jedoch aufgerufen werden, wenn sie eine Hauptmethode enthält.

Sie können sich auch auf den Unterschied zwischen abstrakten Klassen und Schnittstellen in JDK8 beziehen.

10. Was sind Wertübergabe und Referenzübergabe?

Es wird allgemein angenommen, dass die Übertragung in Java per Wert erfolgt. Die Übertragung von Instanzobjekten in Java erfolgt per Referenz.

Beim Übergeben von Werten handelt es sich um eine Kopie der Variablen. Das Ändern der Kopie hat keinen Einfluss auf die ursprüngliche Variable. Es wird im Allgemeinen eine Kopie des Objekts übergeben Adresse, nicht das Originalobjekt selbst.

11. Was ist der Unterschied zwischen Prozess und Thread?

Ein Prozess ist eine ausführende Anwendung, eine dynamische Form des Programms und die Grundeinheit, die Ressourcen wie CPU und Speicher belegt. Darüber hinaus sind Prozesse unabhängig voneinander und die Kommunikation ist dort schwierig Der Eingang, die Ausführungssequenz und der Ausgang sind relativ festgelegt. Ein Thread ist eine Ausführungssequenz innerhalb eines Prozesses und kann zu einem bestimmten Prozess gehören. Threads können keine Ressourcen wie CPU und Speicher belegen, und Threads teilen sich einen Speicherbereich. Kommunikationsvergleich Zweckmäßigerweise wird die Thread-Eintragsausführungssequenz dieser Prozesse vom Anwendungsprogramm gesteuert.

12. Wie viele verschiedene Möglichkeiten gibt es, einen Thread zu erstellen? Welches bevorzugen Sie? Warum?

Es gibt vier Möglichkeiten, Threads zu erstellen.

Erben Sie die Thread-Klasse. Implementieren Sie die Runnable-Schnittstelle. Die Anwendung kann das Executor-Framework verwenden, um einen Thread-Pool zu erstellen.

Die Implementierung der Runnable-Schnittstelle ist beliebter, da hierfür keine Erbung der Thread-Klasse erforderlich ist. Für den Fall, dass andere Objekte im Anwendungsdesign geerbt wurden, ist eine Mehrfachvererbung erforderlich (und Java unterstützt keine Mehrfachvererbung) und es können nur Schnittstellen implementiert werden. Gleichzeitig ist der Thread-Pool sehr effizient und einfach zu implementieren und zu verwenden.

13. Erklären Sie kurz die verschiedenen verfügbaren Thread-Status.

Neu (neu): Ein neues Thread-Objekt wird erstellt. Ausführbar: Nachdem das Thread-Objekt erstellt wurde, rufen andere Threads (z. B. der Hauptthread) die start()-Methode des Objekts auf. Der Thread in diesem Zustand befindet sich im ausführbaren Thread-Pool und wartet darauf, von der Thread-Planung ausgewählt zu werden, um das Recht zur Nutzung der CPU zu erhalten. Laufen (runnable): Der Thread im ausführbaren Zustand (runnable) erhält die CPU-Zeitscheibe (timeslice) und führt den Programmcode aus. Blockieren (Blockieren): Der Blockierungsstatus bedeutet, dass der Thread aus irgendeinem Grund das Recht zur Nutzung der CPU aufgibt, das heißt, er gibt die CPU-Zeitscheibe auf und stoppt vorübergehend die Ausführung. Bis der Thread in den ausführbaren Zustand wechselt, hat er die Möglichkeit, die CPU-Zeitscheibe erneut abzurufen und in den laufenden Zustand zu wechseln. Es gibt drei Arten von Blockierungssituationen:

(1) Warten auf Blockierung: Der laufende Thread führt die Methode o.wait () aus und die JVM stellt den Thread in die Warteschlange (Wartewarteschlange).

(2). Synchrones Blockieren: Wenn ein laufender Thread die Synchronisationssperre eines Objekts erhält und die Synchronisationssperre von einem anderen Thread belegt ist, stellt die JVM den Thread in den Sperrpool.

(3). Andere Blockierung: Wenn ein laufender Thread die Methode Thread.sleep (long ms) oder t.join() ausführt oder eine E/A-Anfrage ausgibt, versetzt die JVM den Thread in einen blockierten Zustand. Wenn der Zustand „sleep()“ abläuft, „join()“ auf die Beendigung oder Zeitüberschreitung des Threads wartet oder die E/A-Verarbeitung abgeschlossen ist, kehrt der Thread in den ausführbaren Zustand zurück.

Tod (tot): Wenn die Ausführung der Methoden run() und main() des Threads endet oder die Methode run() aufgrund einer Ausnahme beendet wird, beendet der Thread seinen Lebenszyklus. Tote Threads können nicht wiederbelebt werden.

Teilen häufiger Fragen zu Java-Schlüsselinterviews

14. Was ist der Unterschied zwischen synchronisierten Methoden und synchronisierten Codeblöcken?

Warum die Synchronisierung verwenden?
Java ermöglicht die gleichzeitige Steuerung mehrerer Threads (Hinzufügen, Löschen, Ändern, Überprüfen), was zu ungenauen Daten und Konflikten untereinander führt Vermeiden Sie Ungenauigkeiten im Thread. Er wird von anderen Threads aufgerufen, bevor die Operation abgeschlossen ist, wodurch die Einzigartigkeit und Genauigkeit der Variablen sichergestellt wird.

Unterschied

Die Synchronisierungsmethode verwendet standardmäßig dieses oder das aktuelle Klassenobjekt als Sperre. Der Synchronisierungscodeblock kann auswählen, was gesperrt werden soll. Dies ist detaillierter als die Synchronisierungsmethode des Codes, der Synchronisierungsprobleme verursacht, verwendet die synchronisierte Methode das Schlüsselwort synchronisiert, um die Methode zu ändern, und der synchronisierte Codeblock ändert hauptsächlich den Code, der synchronisiert werden muss (Objekt). } zum Ändern;

15. Wie führt man im Monitor (Monitor) eine Thread-Synchronisierung durch? Welchen Synchronisationsgrad sollte das Programm erreichen?

Monitore und Sperren werden in der Java Virtual Machine zusammen verwendet. Der Monitor überwacht einen synchronisierten Codeblock, um sicherzustellen, dass jeweils nur ein Thread den synchronisierten Codeblock ausführt. Jeder Monitor ist einer Objektreferenz zugeordnet. Dem Thread ist es nicht gestattet, synchronisierten Code auszuführen, bevor er die Sperre erhält.

16.Was ist ein Deadlock?

Der sogenannte Deadlock bezieht sich auf einen Deadlock (aufeinander warten), der dadurch verursacht wird, dass mehrere Prozesse um Ressourcen konkurrieren. Ohne äußere Kraft können diese Prozesse nicht vorankommen. Vier notwendige Bedingungen für einen Deadlock:

Bedingung des gegenseitigen Ausschlusses: Der Prozess erfordert die ausschließliche Kontrolle über die zugewiesenen Ressourcen (z. B. Drucker), das heißt, eine bestimmte Ressource wird innerhalb eines bestimmten Zeitraums nur von einem Prozess belegt. Wenn zu diesem Zeitpunkt andere Prozesse die Ressource anfordern, kann der anfordernde Prozess nur warten. Bedingung ohne Deprivation: Die von einem Prozess erhaltenen Ressourcen können nicht gewaltsam von anderen Prozessen weggenommen werden, bevor sie vollständig verwendet werden, dh sie können nur von dem Prozess freigegeben werden, der die Ressourcen erhalten hat (sie können nur aktiv freigegeben werden). Anforderungs- und Haltebedingungen: Der Prozess hat mindestens eine Ressource gespeichert, hat jedoch eine neue Ressourcenanforderung gestellt und die Ressource wurde von einem anderen Prozess belegt. Zu diesem Zeitpunkt ist der anfordernde Prozess blockiert, behält jedoch die vorhandenen Ressourcen erhalten. Zirkuläre Wartebedingung: Es gibt eine ==zyklische Wartekette== für Prozessressourcen. Die von jedem Prozess in der Kette erhaltenen Ressourcen werden gleichzeitig vom nächsten Prozess in der Kette angefordert.

17. Wie kann sichergestellt werden, dass N Threads auf N Ressourcen zugreifen können, ohne einen Deadlock zu verursachen?

Bei Verwendung von Multithreading besteht eine sehr einfache Möglichkeit, Deadlocks zu vermeiden: == Geben Sie die Reihenfolge an, in der Sperren erworben werden ==, und zwingen Sie Threads, Sperren in der angegebenen Reihenfolge zu erwerben. Wenn daher alle Threads in derselben Reihenfolge sperren und Sperren freigeben, kommt es zu keinem Deadlock.

18.Was sind die grundlegenden Schnittstellen des Java Collection Class Frameworks?

Die Schnittstelle der Sammlungsklasse gibt eine Reihe von Objekten an, die als Elemente bezeichnet werden. Jede konkrete Implementierungsklasse der Sammlungsklassenschnittstelle kann die Elemente auf ihre eigene Weise speichern und sortieren. Einige Sammlungsklassen erlauben doppelte Schlüssel, andere nicht.
Java-Sammlungsklassen bieten einen gut gestalteten Satz von Schnittstellen und Klassen, die Vorgänge für einen Satz von Objekten unterstützen. Die grundlegendsten Schnittstellen in Java-Sammlungsklassen sind:

Collection: stellt eine Reihe von Objekten dar, jedes Objekt ist sein untergeordnetes Element. Set: Sammlung, die keine doppelten Elemente enthält. Liste: Eine Sammlung, die geordnet ist und wiederholte Elemente enthalten kann. Zuordnen: Ein Objekt, das Schlüssel zu Werten zuordnen kann, kann nicht wiederholt werden.

19. Warum implementiert die Sammlungsklasse die Schnittstellen Cloneable und Serializable nicht?

Die Semantik und Bedeutung des Klonens oder Serialisierens hängt von der spezifischen Implementierung ab. Daher liegt es an der spezifischen Implementierung der Sammlungsklasse, zu bestimmen, wie sie geklont oder serialisiert wird.

20.Was ist ein Iterator?

Die Iterator-Schnittstelle bietet viele Methoden zum Durchlaufen von Sammlungselementen. Jede Sammlungsklasse enthält Iterationsmethoden, die Iteratorinstanzen zurückgeben. Der Iterator kann während des Iterationsprozesses Elemente der zugrunde liegenden Sammlung löschen, sie können jedoch nicht direkt durch Aufrufen von
remove(Object Obj) der Sammlung gelöscht werden. Sie können über die Methode „remove()“ des Iterators gelöscht werden.

21.Was ist der Unterschied zwischen Iterator und ListIterator?

Ihre Unterschiede sind unten aufgeführt:

Iterator kann zum Durchlaufen von Set- und List-Sammlungen verwendet werden, ListIterator kann jedoch nur zum Durchlaufen von Listen verwendet werden. Iterator kann eine Sammlung nur vorwärts durchlaufen, während ListIterator sowohl vorwärts als auch rückwärts durchlaufen kann. ListIterator implementiert die Iterator-Schnittstelle und enthält weitere Funktionen, z. B. das Hinzufügen von Elementen, das Ersetzen von Elementen, das Abrufen des Index des vorherigen und nächsten Elements usw.

22. Was ist der Unterschied zwischen Fail-Fast und Fail-Safe?

Die Ausfallsicherheit von Iterator basiert auf dem Kopieren der zugrunde liegenden Sammlung und wird daher nicht durch Änderungen an der Quellsammlung beeinträchtigt. Alle Sammlungsklassen im Paket java.util sind ausfallsicher, und alle Klassen im Paket java.util.concurrent sind ausfallsicher. Ein ausfallsicherer Iterator löst eine ConcurrentModificationException-Ausnahme aus, während ein ausfallsicherer Iterator niemals eine solche Ausnahme auslöst.

33. Wie funktioniert HashMap in Java?

HashMap in Java speichert Elemente in Form von Schlüssel-Wert-Paaren. HashMap erfordert eine Hash-Funktion, die die Methoden hashCode() und equal() verwendet, um Elemente zur Sammlung hinzuzufügen und aus der Sammlung abzurufen. Wenn die Methode put() aufgerufen wird, berechnet die HashMap den Hashwert des Schlüssels und speichert das Schlüssel-Wert-Paar dann am entsprechenden Index in der Sammlung. Wenn der Schlüssel bereits vorhanden ist, wird der Wert auf den neuen Wert aktualisiert. Einige wichtige Merkmale von HashMap sind seine Kapazität, sein Auslastungsfaktor und die Größenänderung des Schwellenwerts.

34. Welche Bedeutung haben die Methoden hashCode() und equal()?

HashMap in Java verwendet die Methoden hashCode() und equal(), um den Index von Schlüssel-Wert-Paaren zu bestimmen. Diese beiden Methoden werden auch beim Abrufen von Werten basierend auf Schlüsseln verwendet. Wenn diese beiden Methoden nicht korrekt implementiert werden, können zwei verschiedene Schlüssel denselben Hashwert haben und daher von der Sammlung als gleich angesehen werden. Darüber hinaus werden diese beiden Methoden auch zum Auffinden doppelter Elemente verwendet. Daher ist die Implementierung dieser beiden Methoden entscheidend für die Genauigkeit und Korrektheit von HashMap.

35.Was ist der Unterschied zwischen HashMap und Hashtable?

HashMap und Hashtable implementieren beide die Map-Schnittstelle, daher sind viele Funktionen sehr ähnlich. Sie weisen jedoch die folgenden Unterschiede auf:

HashMap lässt zu, dass Schlüssel und Werte null sind, während Hashtable nicht zulässt, dass Schlüssel oder Werte null sind. Hashtable ist synchron, HashMap nicht. Daher eignet sich HashMap besser für Single-Thread-Umgebungen, während Hashtable für Multi-Thread-Umgebungen geeignet ist. HashMap stellt eine Sammlung von Schlüsseln bereit, über die eine Anwendung iterieren kann. Daher ist HashMap ausfallsicher. Andererseits bietet Hashtable eine Aufzählung von Schlüsseln. Es wird allgemein angenommen, dass Hashtable eine Legacy-Klasse ist.

36. Was ist der Unterschied zwischen Array (Array) und Liste (ArrayList)? Wann sollten Sie Array anstelle von ArrayList verwenden?

Array kann Basistypen und Objekttypen enthalten, ArrayList kann nur Objekttypen enthalten. Die Größe von Array ist fest und die Größe von ArrayList ändert sich dynamisch. ArrayList bietet weitere Methoden und Funktionen, wie zum Beispiel: addAll(), removeAll(), iterator() usw. Für grundlegende Datentypen verwenden Sammlungen Autoboxing, um den Codierungsaufwand zu reduzieren. Dieser Ansatz ist jedoch relativ langsam, wenn es um primitive Datentypen fester Größe geht.

37. Was ist der Unterschied zwischen ArrayList und LinkedList?

Sowohl ArrayList als auch LinkedList implementieren die List-Schnittstelle. Sie weisen die folgenden Unterschiede auf:

ArrayList ist eine indexbasierte Datenschnittstelle und ihre unterste Ebene ist ein Array. Es kann einen wahlfreien Zugriff auf Elemente mit einer Zeitkomplexität von O(1) durchführen. Dementsprechend speichert LinkedList seine Daten in der Form == Elementliste ==. In diesem Fall ist die Zeit zum Auffinden eines Elements kompliziert.
Im Vergleich zu ArrayList sind die Einfüge-, Hinzufügungs- und Löschvorgänge von LinkedList schneller, da beim Hinzufügen eines Elements an einer beliebigen Position in der Sammlung keine Neuberechnung der Größe oder Aktualisierung des Index wie bei einem Array erforderlich ist. LinkedList benötigt mehr Speicher als ArrayList, da LinkedList für jeden Knoten zwei Referenzen speichert, eine auf das vorherige Element und eine auf das nächste Element.

38.Wofür werden die Comparable- und Comparator-Schnittstellen verwendet? Listen Sie ihre Unterschiede auf.

Java stellt die Comparable-Schnittstelle bereit, die nur eine CompareTo()-Methode enthält. Diese Methode kann zwei Objekte sortieren. Insbesondere werden negative Zahlen, 0 und positive Zahlen zurückgegeben, um anzuzeigen, dass das vorhandene Objekt kleiner, gleich oder größer als das Eingabeobjekt ist.
Java stellt die Comparator-Schnittstelle mit zwei Methoden bereit: Compare() und Equals(). Die Methode „compare()“ wird zum Sortieren zweier Eingabeparameter verwendet und gibt eine negative Zahl, 0, zurück. Eine positive Zahl gibt an, dass der erste Parameter kleiner, gleich oder größer als der zweite Parameter ist. Die Methode equal() erfordert ein Objekt als Parameter, mit dem ermittelt wird, ob der Eingabeparameter dem Komparator entspricht. Diese Methode gibt nur dann „true“ zurück, wenn der Eingabeparameter auch ein Komparator ist und das Sortierergebnis des Eingabeparameters und des aktuellen Komparators dasselbe ist.

Comparable und Comparator werden beide zum Vergleichen und Sortieren von Elementen in einer Sammlung verwendet. Comparable ist jedoch eine Sortierung, die durch eine innerhalb der Sammlung definierte Methode implementiert wird, und Comparator ist eine Sortierung, die außerhalb der Sammlung implementiert wird Zum Sortieren müssen Sie Methoden der Comparator-Schnittstelle außerhalb der Sammlung definieren oder Methoden der Comparable-Schnittstelle innerhalb der Sammlung implementieren. Comparator befindet sich im Paket java.util und Comparable befindet sich im Paket java.lang. Comparable ist eine Schnittstelle, die von einem Objekt selbst implementiert werden muss, das bereits den Selbstvergleich unterstützt (z. B. String und Integer). Es kann abgeschlossen werden Die Vergleichsoperation selbst und hat die Comparable-Schnittstelle implementiert. Um eine benutzerdefinierte Klasse nach dem Hinzufügen zum Listencontainer zu sortieren, können Sie die Comparable-Schnittstelle beim Sortieren mithilfe der Sortiermethode der Collections-Klasse implementieren, wenn Sie keinen Comparator angeben , dann wird in natürlicher Reihenfolge sortiert. Hier wird die Einstellung „Vergleichbare Schnittstelle“ implementiert.

Komparator ist ein dedizierter Komparator. Wenn das Objekt den Selbstvergleich nicht unterstützt oder die Selbstvergleichsfunktion Ihre Anforderungen nicht erfüllen kann, können Sie einen Komparator schreiben, um den Größenvergleich zwischen zwei Objekten abzuschließen. Man kann sagen, dass der Unterschied zwischen dem einen darin besteht, dass der Vergleich von einem selbst durchgeführt wird, und dem anderen darin, dass das externe Programm den Vergleich implementiert. Die Verwendung von Comparator ist ein Strategieentwurfsmuster, bei dem nicht das Objekt selbst geändert wird, sondern ein Strategieobjekt verwendet wird, um sein Verhalten zu ändern. Beispiel: Wenn Sie Ganzzahlen nach absoluter Größe sortieren möchten, erfüllt Integer die Anforderungen nicht. Sie müssen die Integer-Klasse nicht ändern (tatsächlich ist dies nicht möglich), um ihr Sortierverhalten zu ändern Komparator-Schnittstelle, die die Komparator-Schnittstelle implementiert. Verwenden Sie einfach das Objekt, um seine Sortierung zu steuern.

39. Was ist die Java-Prioritätswarteschlange (Priority Queue)?

PriorityQueue ist eine unbegrenzte Warteschlange, die auf einem Prioritätsheap basiert und deren Elemente in natürlicher Reihenfolge sortiert sind. Beim Erstellen können wir ihm einen Komparator zur Verfügung stellen, der für die Sortierung der Elemente verantwortlich ist. PriorityQueue lässt keine Nullwerte zu, da diese keine natürliche Reihenfolge haben oder keinen zugehörigen Komparator haben. Schließlich ist PriorityQueue nicht threadsicher und die zeitliche Komplexität des Ein- und Ausreihens in die Warteschlange beträgt O(log(n)).

40. Verstehen Sie die Big-O-Notation? Können Sie Beispiele für verschiedene Datenstrukturen nennen?

Die Big-O-Notation beschreibt die Größe des Algorithmus oder eine asymptotische Obergrenze, wenn die Elemente in der Datenstruktur zunehmen.
Die Big-O-Notation kann auch zur Beschreibung anderer Verhaltensweisen verwendet werden, beispielsweise des Speicherverbrauchs. Da es sich bei Sammlungsklassen eigentlich um Datenstrukturen handelt, verwenden wir im Allgemeinen die Big-O-Notation, um die beste Implementierung basierend auf Zeit, Speicher und Leistung auszuwählen. Die Big-O-Notation kann einen guten Eindruck von der Leistung großer Datenmengen vermitteln.

41.Was sind die Unterschiede zwischen der Enumeration-Schnittstelle und der Iterator-Schnittstelle?

Enumeration ist 2-mal schneller als Iterator und benötigt weniger Speicher. Allerdings ist Iterator weitaus sicherer als Enumeration, da andere Threads die Objekte in der Sammlung, die vom Iterator durchlaufen wird, nicht ändern können. Gleichzeitig ermöglicht Iterator dem Aufrufer, Elemente in der zugrunde liegenden Sammlung zu löschen, was mit Enumeration nicht möglich ist.

42.Was ist der Unterschied zwischen HashSet und TreeSet?

HashSet wird durch eine Hash-Tabelle implementiert, daher sind seine Elemente ungeordnet. Die zeitliche Komplexität der Methoden add(), remove() und contains() beträgt O(1). Andererseits wird TreeSet durch eine Baumstruktur implementiert und die darin enthaltenen Elemente sind geordnet. Daher beträgt die zeitliche Komplexität der Methoden add(), remove() und contains() O(logn).

43.Was ist der Zweck der Garbage Collection in Java? Wann findet die Garbage Collection statt?

Die Speicherbereinigung wird durchgeführt, wenn nicht referenzierte Objekte oder Objekte im Speicher vorhanden sind, die den Umfang überschreiten.
Der Zweck der Garbage Collection besteht darin, Objekte zu identifizieren und zu verwerfen, die von der Anwendung nicht mehr verwendet werden, um Ressourcen freizugeben und wiederzuverwenden.

44.Was machen System.gc() und Runtime.gc()?

Diese beiden Methoden werden verwendet, um die JVM zur Durchführung der Speicherbereinigung aufzufordern. Ob die Garbage Collection jedoch sofort beginnt oder verzögert wird, hängt von der JVM ab.

45. Wann wird die finalize()-Methode aufgerufen? Was ist der Zweck des Destruktors (Finalisierung)?

Wenn der Garbage Collector beschließt, ein Objekt zu recyceln, führt er die finalize()-Methode des Objekts aus. Wenn in Java jedoch immer genügend Speicher vorhanden ist, kann es sein, dass die Garbage Collection nie stattfindet, d. h. es wird Filalize genannt () wird möglicherweise nie ausgeführt, und es ist offensichtlich unzuverlässig, von ihm zu erwarten, dass er die letzte Arbeit erledigt. Was genau macht finalize()? Sein Hauptzweck besteht darin, von speziellen Kanälen zugewiesenen Speicher zurückzugewinnen. Java-Programme verfügen über Garbage Collectors, sodass sich Programmierer unter normalen Umständen keine Gedanken über Speicherprobleme machen müssen. Es gibt jedoch ein JNI (Java Native Interface), das ein Nicht-Java-Programm (C oder C++) aufruft, und die Aufgabe von finalize() besteht darin, diesen Teil des Speichers zurückzugewinnen.

Aufrufzeitpunkt: Wenn der Garbage Collector ein Objekt für tot erklären möchte, muss er mindestens zwei Markierungsprozesse durchlaufen: Wenn nach der Erreichbarkeitsanalyse festgestellt wird, dass das Objekt keine mit GC Roots verbundene Referenzkette hat, wird es für markiert Markieren Sie und bestimmen Sie, ob die Methode finalizer() ausgeführt werden soll. Wenn das Objekt die Methode finalizer() überschreibt und nicht von der virtuellen Maschine aufgerufen wurde, wird es in die F-Warteschlange gestellt Wird später automatisch von einer virtuellen Maschine erstellt. Die Ausführung des Finalizer-Thread-Bereichs mit niedriger Priorität löst die Methode finalizer() aus, verspricht jedoch nicht, auf das Ende ihres Vorgangs zu warten.

(Empfohlenes Tutorial: Java-Kurs)

Der Zweck der Finalisierung: die letzte Chance des Objekts, dem Tod zu entkommen. (Stellen Sie einfach eine erneute Verknüpfung mit einem beliebigen Objekt in der Referenzkette her.) Die Ausführung ist jedoch teuer, sehr unsicher und die Aufrufreihenfolge jedes Objekts kann nicht garantiert werden. Verwenden Sie try-finally oder andere Alternativen.

46. Wenn die Referenz eines Objekts auf Null gesetzt ist, gibt der Garbage Collector dann sofort den vom Objekt belegten Speicher frei?

Nein, dieses Objekt kann im nächsten Müllsammelzyklus wiederverwertet werden.

Der vom Objekt belegte Speicher wird nicht sofort freigegeben. Wenn die Referenz des Objekts auf Null gesetzt ist, wird die Referenz auf das Objekt nur im aktuellen Thread-Stack-Frame getrennt, und der Garbage Collector ist ein Thread, der im Hintergrund ausgeführt wird. Er kann nur verwendet werden, wenn der Benutzer-Thread zu a ausgeführt wird Sicherer Punkt (sicherer Punkt) oder sicher Die Objektreferenzbeziehung wird nur im Bereich gescannt. Wenn das Objekt nicht referenziert ist, wird das Objekt zu diesem Zeitpunkt nicht sofort freigegeben, da einige Objekte wiederherstellbar sind (Referenzen werden in der finalize-Methode wiederhergestellt). Der Objektspeicher wird nur gelöscht, wenn festgestellt wird, dass das Objekt nicht wiederhergestellt werden kann.

47.Wie ist die Struktur des Java-Heaps? Was ist der Perm-Gen-Speicherplatz im Heap? Der Heap der JVM ist der Laufzeitdatenbereich, und alle Klasseninstanzen und Arrays weisen Speicher auf dem Heap zu. Es wird beim Start der JVM erstellt. Der vom Objekt belegte Heap-Speicher wird vom automatischen Speicherverwaltungssystem, also dem Garbage Collector, zurückgewonnen.

Der Heapspeicher besteht aus lebenden und toten Objekten. Auf verbleibende Objekte kann die Anwendung zugreifen und sie werden nicht durch Garbage Collection erfasst. Tote Objekte sind Objekte, auf die die Anwendung keinen Zugriff hat und die noch nicht vom Garbage Collector zurückgefordert wurden. Bis der Garbage Collector diese Objekte sammelt, belegen sie weiterhin Heap-Speicherplatz.

Die permanente Generierung wird zum Speichern statischer Dateien wie Java-Klassen, Methoden usw. verwendet. Die persistente Generierung hat keine wesentlichen Auswirkungen auf die Speicherbereinigung, aber einige Anwendungen können einige Klassen dynamisch generieren oder aufrufen, z. B. Ruhezustand usw. In diesem Fall muss ein relativ großer persistenter Generierungsraum eingerichtet werden, um diese neu hinzugefügten Klassen währenddessen zu speichern Operation, dauerhaft. Der Code enthält im Allgemeinen:
Methoden der Klasse (Bytecode...)
Klassenname (Sring-Objekt)
Konstanteninformationen, die aus der .class-Datei gelesen werden
Objektliste und Typliste im Zusammenhang mit dem Klassenobjekt (z. B. Array von Methodenobjekten).
Von der JVM erstellte interne Objekte. Vom JIT-Compiler zur Optimierung verwendete Informationen.

48

Der Durchsatzkollektor verwendet eine parallele Version des Garbage Collectors der jungen Generation, der für Anwendungen mit mittelgroßen und großen Datenmengen verwendet wird. Der serielle Kollektor ist für die meisten kleinen Anwendungen ausreichend (die auf modernen Prozessoren etwa 100 MB Speicher erfordern).

49. Wann können Objekte in Java durch Müll gesammelt werden?

Wenn ein Objekt von GC Roots aus nicht erreichbar ist, wird es versuchen, das Objekt im nächsten Garbage-Collection-Zyklus zu recyceln. Wenn das Objekt die finalize()-Methode überschreibt und sich selbst erfolgreich in dieser Methode speichert (indem es sich einer Referenz zuweist), dann Dieses Objekt wird nicht recycelt. Wenn das Objekt jedoch die finalize()-Methode nicht überschreibt oder diese Methode bereits ausgeführt hat und sich nicht selbst speichern kann, wird das Objekt recycelt.

50. Wird die Speicherbereinigung in der permanenten JVM-Generation stattfinden?

Eine Garbage Collection findet in der permanenten Generation nicht statt. Wenn die permanente Generation voll ist oder den kritischen Wert überschreitet, wird eine vollständige Garbage Collection (Full GC) ausgelöst. Wenn Sie sich die Ausgabe des Garbage Collectors genau ansehen, werden Sie feststellen, dass auch die permanente Generation gesammelt wird. Aus diesem Grund ist die richtige Größe der permanenten Generation sehr wichtig, um eine vollständige GC zu vermeiden. Weitere Informationen finden Sie unter Java8: Von der permanenten Generierung zum Metadatenbereich. (Hinweis: Die permanente Generierung wurde in Java8 entfernt und ein neuer nativer Speicherbereich namens Metadatenbereich hinzugefügt.) Was ist der Unterschied zwischen ihnen?


In Java gibt es zwei Arten von Ausnahmen: geprüfte Ausnahmen und ungeprüfte Ausnahmen. Ungeprüfte Ausnahmen müssen nicht für eine Methode oder einen Konstruktor deklariert werden, auch wenn die Ausführung der Methode oder des Konstruktors eine solche Ausnahme auslösen kann und ungeprüfte Ausnahmen sich außerhalb der Methode oder des Konstruktors verbreiten können. Stattdessen müssen geprüfte Ausnahmen mithilfe der throws-Anweisung für die Methode oder den Konstruktor deklariert werden. Hier finden Sie einige Tipps zur Java-Ausnahmebehandlung.

Throwable umfasst zwei Arten von Fehlern (Error) und Ausnahmen (Excetion)

Exception umfasst auch Laufzeitausnahmen (RuntimeException, auch ungeprüfte Ausnahmen genannt) und Nicht-Laufzeitausnahmen (auch geprüfte Ausnahmen genannt)

(1) Fehler ist Das Programm kann nicht Behandeln Sie es. Wenn diese Ausnahmen auftreten, beendet die Java Virtual Machine im Allgemeinen den Thread (2). Laufzeitausnahmen sind die RuntimeException-Klasse und ihre Unterklassen, z. B. NullPointerException, IndexOutOfBoundsException usw. Diese Ausnahmen werden nicht überprüft. Ausnahmen können auftreten, wenn das Programm ausgeführt wird, sodass das Programm sie möglicherweise abfängt. Diese Fehler werden im Allgemeinen durch logische Fehler im Programm verursacht, und das Programm sollte versuchen, sie aus logischer Sicht zu vermeiden.

(3) Überprüfen Sie Ausnahmen Sie sind Ausnahmen außer Laufzeitausnahmen und auch Ausnahmen und ihre Unterklassen. Aus Programmsicht müssen diese Ausnahmen abgefangen und überprüft werden, da sie sonst die Kompilierung nicht bestehen können.


52.Was ist der Unterschied zwischen Ausnahme und Fehler in Java?

Exception und Error sind beide Unterklassen von Throwable. Exception wird für Ausnahmen verwendet, die von Benutzerprogrammen abgefangen werden können. Fehler definiert Ausnahmen, von denen nicht erwartet wird, dass sie von Benutzerprogrammen abgefangen werden.

53.Was ist der Unterschied zwischen Wurf und Würfen?

Das Schlüsselwort throw wird verwendet, um Ausnahmen im Programm explizit auszulösen. Im Gegensatz dazu wird die throws-Anweisung verwendet, um Ausnahmen anzuzeigen, die die Methode nicht verarbeiten kann. Jede Methode muss angeben, welche Ausnahmen nicht behandelt werden können, damit der Aufrufer der Methode sicherstellen kann, dass mögliche Ausnahmen durch Kommas getrennt werden.

1. Throw wird innerhalb der Methode verwendet, und Throws wird von dem Ausnahmetyp gefolgt.

3 Ausnahmeobjekt, und nach dem Typ „Throws“ können mehrere Ausnahmen gleichzeitig deklariert werden.

54. Was passiert mit dem Ausnahmeobjekt, nachdem die Ausnahmebehandlung abgeschlossen ist? ,

Ausnahmeobjekte werden beim nächsten Garbage-Collection-Prozess recycelt.

55. Was ist der Unterschied zwischen der Methode „finally code block“ und „finalize()“?

Der finale Codeblock wird unabhängig davon ausgeführt, ob eine Ausnahme ausgelöst wird. Er dient hauptsächlich dazu, die von der Anwendung belegten Ressourcen freizugeben. Die finalize()-Methode ist eine geschützte Methode der Object-Klasse. Sie wird von der Java Virtual Machine aufgerufen, bevor das Objekt durch Müll gesammelt wird.

56. Was ist ein Applet?

Ein Java-Applet ist ein Programm, das in eine HTML-Seite eingebunden und von einem Java-fähigen Client-Browser ausgeführt werden kann. Applets werden hauptsächlich zur Erstellung dynamischer interaktiver Webanwendungen verwendet.

57. Erklären Sie den Lebenszyklus von Applet.

Applet kann die folgenden Zustände durchlaufen:

Init: Es wird jedes Mal initialisiert, wenn es geladen wird.

Start: Starten Sie die Ausführung des Applets.

Stop: Beenden Sie die Ausführung des Applets.

Zerstören: Führen Sie die letzte Bereinigung durch, bevor Sie das Applet deinstallieren.

58. Was passiert, wenn das Applet geladen wird?

Erstellen Sie zunächst eine Instanz der Applet-Steuerklasse, initialisieren Sie dann das Applet und beginnen Sie schließlich mit der Ausführung.

59. Was ist der Unterschied zwischen Applet und gewöhnlicher Java-Anwendung?

Applets werden in Java-fähigen Browsern ausgeführt, und Java-Anwendungen sind unabhängige Java-Programme, die außerhalb des Browsers ausgeführt werden können. Allerdings benötigen sie alle eine Java Virtual Machine.
Darüber hinaus benötigt eine Java-Anwendung eine Hauptfunktion mit einer bestimmten Methodensignatur, um die Ausführung zu starten. Java-Applets benötigen keine solche Funktion, um die Ausführung zu starten.
Schließlich verwenden Java-Applets im Allgemeinen sehr strenge Sicherheitsrichtlinien und Java-Anwendungen verwenden im Allgemeinen lockerere Sicherheitsrichtlinien.

60. Welche Einschränkungen gelten für Java-Applets?

Vor allem aus Sicherheitsgründen gelten für das Applet folgende Einschränkungen:
Applet kann keine Klassenbibliotheken laden oder lokale Methoden definieren; ist mit dem Host-Rechner verbunden; es können keine anderen Programme auf dem Host-Rechner geöffnet werden.

61. Was ist ein nicht vertrauenswürdiges Applet?

Nicht vertrauenswürdige Applets sind Java-Applets, die nicht auf lokale Systemdateien zugreifen oder diese ausführen können. Standardmäßig sind alle heruntergeladenen Applets nicht vertrauenswürdig.

62. Was ist der Unterschied zwischen einem aus dem Netzwerk geladenen Applet und einem aus dem lokalen Dateisystem geladenen Applet?

Wenn ein Applet aus dem Netzwerk geladen wird, wird das Applet vom Applet-Klassenlader geladen, was durch den Applet-Sicherheitsmanager eingeschränkt wird.
Wenn das Applet von der lokalen Festplatte des Clients geladen wird, wird das Applet vom Dateisystem-Loader geladen.
Das aus dem Dateisystem geladene Applet ermöglicht das Lesen von Dateien, das Schreiben von Dateien und das Laden von Klassenbibliotheken auf dem Client sowie die Ausführung anderer Programme, kann jedoch die Bytecode-Überprüfung nicht bestehen.

63. Was ist ein Applet-Klassenlader? Was wird es tun?

Wenn ein Applet aus dem Netzwerk geladen wird, wird es vom Applet-Klassenlader geladen. Klassenlader haben ihre eigene Java-Namespace-Hierarchie. Der Klassenlader stellt sicher, dass Klassen aus dem Dateisystem einen eindeutigen Namensraum haben und Klassen aus Netzwerkressourcen einen eindeutigen Namensraum haben.
Wenn ein Browser ein Applet über das Netzwerk lädt, wird die Klasse des Applets in einem privaten Namensraum platziert, der mit der Quelle des Applets verknüpft ist. Anschließend werden die vom Klassenlader geladenen Klassen vom Validator überprüft. Der Validator prüft, ob das Klassendateiformat der Java-Sprachspezifikation entspricht, um sicherzustellen, dass kein Stapelüberlauf oder -unterlauf auftritt und dass die an die Bytecode-Anweisungen übergebenen Parameter korrekt sind.

64. Was ist der Applet-Sicherheitsmanager? Was wird es tun?

Der Applet-Sicherheitsmanager ist ein Mechanismus zum Auferlegen von Einschränkungen für Applets. Ein Browser kann nur einen Sicherheitsmanager haben. Der Sicherheitsmanager wird beim Start erstellt und kann später nicht ersetzt oder erweitert werden.

65. Was ist der Unterschied zwischen Popup-Auswahlmenü (Auswahl) und Liste (Liste)?

Choice wird in kompakter Form angezeigt und Sie müssen nach unten scrollen, um alle Optionen zu sehen. Unter „Auswahl“ kann jeweils nur eine Option ausgewählt werden. Die Liste kann mehrere gleichzeitig sichtbare Elemente enthalten und unterstützt die Auswahl eines oder mehrerer Elemente.

66. Was ist ein Layoutmanager?

Layoutmanager werden verwendet, um Komponenten in Containern zu organisieren.

67. Was ist der Unterschied zwischen einer Bildlaufleiste (Scrollbar) und einem Bildlauffeld (JScrollPane)?

Scrollbar ist eine Komponente, kein Container. Und ScrollPane ist ein Container. ScrollPane verarbeitet Scroll-Ereignisse selbst.

68. Welche Swing-Methoden sind threadsicher?

Es gibt nur 3 Thread-sichere Methoden: repaint(), revalidate() und invalidate().

69. Nennen Sie drei Komponenten, die das Nachlackieren unterstützen.

Canvas, Frame, Panel und Applet unterstützen das Neuzeichnen.

70. Was ist JDBC?

JDBC ist eine Abstraktionsschicht, die es Benutzern ermöglicht, zwischen verschiedenen Datenbanken zu wählen. Mit JDBC können Entwickler Datenbankanwendungen in JAVA schreiben, ohne sich um die Details der zugrunde liegenden spezifischen Datenbank kümmern zu müssen.

JDBC (Java DataBase Connectivity) ist eine Reihe objektorientierter Anwendungsprogrammierschnittstellen (APIs). Es formuliert eine einheitliche Standardschnittstelle für den Zugriff auf verschiedene relationale Datenbanken und stellt Standardimplementierungen für verschiedene Datenbankhersteller bereit. Durch die JDBC-Technologie können Entwickler komplette Datenbankanwendungen mit reiner Java-Sprache und Standard-SQL-Anweisungen schreiben und den plattformübergreifenden Charakter der Software wirklich erkennen.
Normalerweise wird JDBC verwendet, um die folgenden Vorgänge auszuführen:
1. Stellen Sie eine Verbindung mit der Datenbank her.
3. Verarbeiten Sie die von der Datenbank zurückgegebenen Ergebnisse 1. JDBC und ODBC ( Open Database Connectivity (Open Database Connectivity) sind sehr ähnlich und für Softwareentwickler leicht zu verstehen;
2.JDBC befreit Softwareentwickler von der komplexen Arbeit beim Schreiben von Treibern und kann sich vollständig auf die Entwicklung der Geschäftslogik konzentrieren;
3.JDBC Unterstützt eine Vielzahl relationaler Datenbanken und erhöht so die Portabilität der Software.
4 Die JDBC-API ist objektorientiert und Softwareentwickler können häufig verwendete Methoden neu kapseln, um die Wiederverwendbarkeit von Code zu verbessern bedeuten?

Interaktionen mit der Datenbank wie das Öffnen und Schließen von Datenbankverbindungen können zeitaufwändig sein, insbesondere wenn die Anzahl der Clients steigt, viele Ressourcen verbrauchen und die Kosten sehr hoch sind. Beim Start des Anwendungsservers können viele Datenbankverbindungen in einem Pool hergestellt und verwaltet werden. Verbindungsanfragen werden von Verbindungen im Pool bedient. Nachdem die Verbindung aufgebraucht ist, wird die Verbindung an den Pool zurückgegeben, um in Zukunft für die Erfüllung weiterer Anforderungen verwendet zu werden.

72. Welche Schritte sind erforderlich, damit das RMI-Programm ordnungsgemäß ausgeführt wird?

Damit das RMI-Programm korrekt ausgeführt werden kann, müssen die folgenden Schritte enthalten sein:
Kompilieren Sie alle Quelldateien.
Verwenden Sie rmic, um einen Stub zu generieren.
Rmiregistry starten.
Starten Sie den RMI-Server.
Führen Sie das Client-Programm aus.

73. Erklären Sie das Ein- und Ausmarschieren.

Wenn eine Anwendung ein Speicherobjekt über das Netzwerk auf einen anderen Host übertragen oder im Speicher speichern möchte, muss sie die Darstellung des Objekts im Speicher in ein geeignetes Format konvertieren. Dieser Vorgang wird Marshalling genannt, der umgekehrte Vorgang ist Demarshalling.

74. Erklären Sie Serialisierung und Deserialisierung.

Java bietet einen Mechanismus namens Objektserialisierung, der das Objekt als eine Reihe von Bytes darstellt, die die Daten des Objekts, die Typinformationen des Objekts, die Typinformationen der Daten im Objekt usw. enthält. Daher kann Serialisierung als eine Möglichkeit gesehen werden, Objekte zu verflachen, um sie auf der Festplatte zu speichern oder von der Festplatte zu lesen und zu rekonstruieren. Die Deserialisierung ist der umgekehrte Schritt der Umwandlung eines Objekts aus einem flachen Zustand in ein Live-Objekt.

75. Was ist Servlet?

Servlet ist eine Java-Klasse, die zur Verarbeitung von Client-Anfragen und zur Generierung dynamischer Webinhalte verwendet wird. Servlet wird hauptsächlich zum Verarbeiten oder Speichern von über HTML-Formularen übermittelten Daten, zum Generieren dynamischer Inhalte und zum Verwalten von Statusinformationen unter dem zustandslosen HTTP-Protokoll verwendet.

76. Lassen Sie uns über die Architektur von Servlet sprechen.

Die Kernschnittstelle, die alle Servlets implementieren müssen, ist javax.servlet.Servlet. Jedes Servlet muss diese Schnittstelle direkt oder indirekt implementieren oder javax.servlet.GenericServlet oder javax.servlet.http.HTTPServlet erben. Schließlich nutzen Servlets mehrere Threads, um mehrere Anfragen parallel zu bedienen.

77. Was ist eine Webanwendung?

Webanwendungen sind dynamische Erweiterungen des Web- oder Anwendungsservers. Es gibt zwei Arten von Webanwendungen: präsentationsorientierte und serviceorientierte. Präsentationsorientierte Webanwendungen generieren als Reaktion auf Anfragen interaktive Webseiten, die eine Vielzahl von Auszeichnungssprachen und dynamischen Inhalten enthalten. Serviceorientierte Webanwendungen implementieren die Endpunkte von Webdiensten. Im Allgemeinen kann eine Webanwendung als eine Sammlung von Servlets betrachtet werden, die unter einer bestimmten Teilmenge des URL-Namespace des Servers installiert sind.

78. Wie erfahren Sie, welcher Client-Rechner Ihr Servlet anfordert?

Die ServletRequest-Klasse kann die IP-Adresse oder den Hostnamen des Client-Computers ermitteln. Die Methode getRemoteAddr() ruft die IP-Adresse des Client-Hosts ab und getRemoteHost() ruft den Hostnamen ab.

79. Wie ist die HTTP-Antwort aufgebaut?

HTTP-Antwort besteht aus drei Teilen:
Statuscode: Beschreibt den Status der Antwort. Kann verwendet werden, um zu überprüfen, ob die Anfrage erfolgreich abgeschlossen wurde. Für den Fall, dass eine Anfrage fehlschlägt, kann der Statuscode verwendet werden, um den Grund für den Fehler herauszufinden. Wenn das Servlet keinen Statuscode zurückgibt, wird standardmäßig der erfolgreiche Statuscode HttpServletResponse.SC_OK zurückgegeben.
HTTP-Header: Sie enthalten weitere Informationen zur Antwort. Der Header kann beispielsweise ein Ablaufdatum angeben, an dem die Antwort als abgelaufen gilt, oder er kann ein Codierungsformat angeben, das zur sicheren Übertragung von Entitätsinhalten an den Benutzer verwendet wird. Wie Sie HTTP-Header in Serlet abrufen, erfahren Sie hier.
Text: Er enthält den Inhalt der Antwort. Es kann HTML-Code, Bilder usw. enthalten. Der Body besteht aus den Datenbytes, die in der HTTP-Nachricht direkt im Anschluss an den Header übertragen werden.

80. Was sind Kekse? Was ist der Unterschied zwischen Sitzung und Cookie?

Ein Cookie ist eine Information, die vom Webserver an den Browser gesendet wird. Der Browser speichert Cookies für jeden Webserver in einer lokalen Datei. Wenn der Browser künftig eine Anfrage an einen bestimmten Webserver sendet, sendet er auch alle für diesen Server gespeicherten Cookies. Der Unterschied zwischen Sitzung und Cookie ist unten aufgeführt:
Egal welche Einstellungen der Client-Browser vornimmt, die Sitzung sollte normal funktionieren. Der Client kann Cookies deaktivieren, die Sitzung funktioniert jedoch weiterhin, da der Client die serverseitige Sitzung nicht deaktivieren kann.
Sitzung und Cookies unterscheiden sich auch hinsichtlich der Menge der gespeicherten Daten. Die Sitzung kann jedes Java-Objekt speichern, und das Cookie kann nur Objekte vom Typ String speichern.

81. Wie werden JSP-Anfragen verarbeitet?

Der Browser fordert zunächst eine Seite mit der Endung .jsp an und initiiert eine JSP-Anfrage. Anschließend liest der Webserver die Anfrage und konvertiert die JSP-Seite mithilfe des JSP-Compilers in eine Servlet-Klasse. Es ist zu beachten, dass die JSP-Datei nur kompiliert wird, wenn die Seite zum ersten Mal angefordert wird oder sich die JSP-Datei ändert. Anschließend ruft der Server die Servlet-Klasse auf, um die Anforderung des Browsers zu verarbeiten. Sobald die Anforderungsausführung abgeschlossen ist, sendet das Servlet die Antwort an den Client.

82. Was sind die Definitionen und Vorteile der Kapselung?

Kapselung bietet Objekten die Möglichkeit, interne Eigenschaften und Verhaltensweisen zu verbergen. Ein Objekt stellt Methoden bereit, auf die andere Objekte zugreifen können, um seine internen Daten zu ändern. In Java gibt es drei Modifikatoren: öffentlich, privat und geschützt. Jeder Modifikator gewährt unterschiedliche Zugriffsrechte für andere Objekte, die sich im selben Paket oder in anderen Paketen befinden.
Im Folgenden sind einige der Vorteile der Kapselung aufgeführt:
Schützen Sie den Zustand innerhalb eines Objekts, indem Sie seine Eigenschaften verbergen.
Verbessert die Benutzerfreundlichkeit und Wartbarkeit von Code, da das Verhalten von Objekten individuell geändert oder erweitert werden kann.
Verbieten Sie schlechte Interaktionen zwischen Objekten, um die Modularität zu verbessern.
Weitere Details und Beispiele zur Kapselung finden Sie in diesem Dokument.

oder:

Verwenden Sie zunächst private, um die Details der Klasse von der Außenwelt zu isolieren und so die Datenelemente und Methoden zu verbergen. Der einzige Weg, auf diese Datenelemente und Methoden zuzugreifen, ist über die Klasse selbst, und die Klasse ist es qualifiziert, es aufzurufen Die Ressourcen, die es besitzt (Methoden, Datenelementeigenschaften usw.). Der erste Vorteil besteht also darin, dass die Datensicherheit verbessert wird.
Zweitens ist durch die versteckte Isolation nur begrenzter externer Zugriff auf die Klasse möglich, ohne dass Entwickler die interne Implementierung der Klasse ändern müssen, ohne die Programme zu ändern, die die Klasse verwenden. Solange die Methoden, die außerhalb der Klasse aufgerufen werden können, ihre externen Eigenschaften beibehalten, kann der interne Code frei an ihre Bedürfnisse angepasst werden, was die Arbeitsteilung erleichtert.
Die dritte besteht darin, die Wiederverwendbarkeit des Codes zu verbessern, nachdem er in eine Toolklasse gekapselt wurde. Dadurch können viele mühsame Schritte reduziert werden.

83. Die Definition von abstrakt? Was ist der Unterschied zwischen Abstraktion und Kapselung?

Abstraktion ist der Schritt, bei dem Ideen von konkreten Instanzen getrennt werden und so Klassen basierend auf ihrer Funktionalität und nicht auf Implementierungsdetails erstellt werden. Java unterstützt die Erstellung abstrakter Klassen, die nur Schnittstellen verfügbar machen, aber keine Methodenimplementierungen enthalten. Der Hauptzweck dieser Abstraktionstechnik besteht darin, das Verhalten der Klasse von den Implementierungsdetails zu trennen. Abstraktion und Kapselung sind komplementäre Konzepte. Einerseits konzentriert sich die Abstraktion auf das Verhalten von Objekten. Die Kapselung hingegen konzentriert sich auf die Details des Verhaltens eines Objekts. Die Kapselung wird im Allgemeinen durch das Verbergen der internen Zustandsinformationen eines Objekts erreicht. Daher kann die Kapselung als eine Strategie zur Bereitstellung von Abstraktion angesehen werden.

Verwandte Empfehlungen: Erste Schritte mit Java

Das obige ist der detaillierte Inhalt vonTeilen häufiger Fragen zu Java-Schlüsselinterviews. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage