Die Interviewfragen lauten wie folgt:
1. Was ist der Nutzen von a.hashCode()? Was hat es mit a.equals(b) zu tun?
(Empfehlungen für weitere verwandte Interviewfragen: Java-Interviewfragen und -antworten)
hashCode()-Methode entspricht dem Hashwert des Objekt-Integer-Typs. Es wird häufig in Hash-basierten Sammlungsklassen wie Hashtable, HashMap, LinkedHashMap usw. verwendet. Sie ist besonders eng mit der Methode equal() verwandt. Gemäß der Java-Spezifikation müssen zwei Objekte, die mit der Methode equal() gleich sind, denselben Hash-Code haben.
2. Der Unterschied zwischen Byte-Stream und Zeichen-Stream
So geben Sie Binärdaten einzeln an ein bestimmtes Gerät aus oder lesen Sie Binärdaten einzeln von einem bestimmten Gerät, unabhängig von der Eingabe und Ausgabegerät ist, müssen wir diese Operationen auf einheitliche Weise abschließen und auf abstrakte Weise beschreiben. Diese abstrakte Beschreibungsmethode heißt IO-Stream, und die entsprechenden abstrakten Klassen sind OutputStream und InputStream. Verschiedene Implementierungsklassen repräsentieren unterschiedliche Eingaben und Ausgaben Geräte arbeiten alle mit Bytes.
Alles im Computer existiert letztendlich in binärer Byteform. Rufen Sie für häufig verwendete chinesische Zeichen zunächst die entsprechenden Bytes ab und schreiben Sie diese dann in den Ausgabestream. Beim Lesen werden zunächst Bytes gelesen. Wenn wir sie jedoch als Zeichen anzeigen möchten, müssen wir die Bytes in Zeichen konvertieren. Da solche Anforderungen weit verbreitet sind, stellt Java speziell eine Zeichenstrom-Wrapper-Klasse bereit.
Das zugrunde liegende Gerät akzeptiert immer nur Byte-Daten. Um eine Zeichenfolge auf das zugrunde liegende Gerät zu schreiben, müssen Sie die Zeichenfolge manchmal vor dem Schreiben in Bytes konvertieren. Der Zeichenstrom ist ein Wrapper für den Bytestrom. Er wandelt die Zeichenfolgen intern in Bytes um und schreibt sie dann auf das zugrunde liegende Gerät. Dadurch erhalten wir einige Informationen zum Schreiben oder Lesen von Zeichenfolgen IO-Gerät.
Achten Sie beim Konvertieren von Zeichen in Bytes auf das Codierungsproblem, denn beim Konvertieren einer Zeichenfolge in ein Byte-Array wird diese tatsächlich in eine bestimmte codierte Byteform des Zeichens konvertiert, und beim Lesen ist das Gegenteil der Fall.
3. Was ist Java-Serialisierung und wie implementiert man Java-Serialisierung? Oder erläutern Sie bitte die Rolle der serialisierbaren Schnittstelle.
Manchmal übertragen wir ein Java-Objekt in einen Byte-Stream oder stellen es aus einem Byte-Stream in ein Java-Objekt wieder her. Wenn wir beispielsweise das Java-Objekt auf der Festplatte speichern oder an andere Computer im Netzwerk übertragen möchten, ist dies der Fall Dabei können wir unseren eigenen Code schreiben, um ein Java-Objekt in einen Bytestream in einem bestimmten Format umzuwandeln und ihn dann zu übertragen.
Jre selbst stellt diese Unterstützung bereit. Wir können dazu die writeObject-Methode von OutputStream aufrufen. Wenn wir möchten, dass Java dies für uns erledigt, muss das zu übertragende Objekt die serialisierbare Schnittstelle implementieren Spezielle Vorgänge beim Kompilieren können erst nach der Verarbeitung mit der Methode writeObject ausgeführt werden, die als Serialisierung bezeichnet wird. Die zu serialisierende Klasse muss die Serializable-Schnittstelle implementieren. Bei dieser Schnittstelle handelt es sich um eine Minischnittstelle, in der keine Methoden implementiert werden müssen.
Wenn beispielsweise in der Webentwicklung das Objekt in der Sitzung gespeichert wird, muss Tomcat beim Neustart das Sitzungsobjekt auf der Festplatte serialisieren, und dieses Objekt muss die serialisierbare Schnittstelle implementieren. Wenn ein Objekt über ein verteiltes System über das Netzwerk übertragen werden soll, muss das übertragene Objekt die Serializable-Schnittstelle implementieren.
4. Beschreiben Sie den prinzipiellen Mechanismus des JVM-Ladens von Klassendateien?
Das Laden von Klassen in JVM wird durch ClassLoader und seine Unterklassen implementiert. Es ist dafür verantwortlich, Klassen zur Laufzeit aus Klassendateien zu finden und zu laden.
(Verwandte Tutorial-Empfehlung: Java-Einführungs-Tutorial)
5. Was ist der Unterschied zwischen Heap und Stack?
Java-Speicher ist in zwei Kategorien unterteilt: Stapelspeicher und Heap-Speicher. Stapelspeicher bedeutet, dass, wenn das Programm eine Methode betritt, dieser Methode ein privater Speicherplatz zugewiesen wird, um lokale Variablen innerhalb dieser Methode zu speichern. Wenn diese Methode endet, werden auch die dieser Methode zugewiesenen Stapel freigegeben entsprechend.
Der Heap ist ein Speicher, der andere Funktionen als der Stapel hat. Er wird im Allgemeinen zum Speichern von Daten verwendet, die sich nicht im aktuellen Methodenstapel befinden. Beispielsweise werden mit new erstellte Objekte im Heap abgelegt, sodass sie nicht verschwinden Die Methode endet. Nachdem die lokalen Variablen in der Methode mit final geändert wurden, werden sie im Heap statt im Stapel abgelegt.
6. Was ist GC?
GC bedeutet, dass Programmierer bei der Speicherverarbeitung anfällig für Ungenauigkeiten sind oder sogar abstürzen. Die von Java bereitgestellte GC-Funktion kann automatisch erkennen, ob das Objekt den Bereich überschreitet, um den Zweck der automatischen Rückgewinnung von Speicher zu erreichen. Die Java-Sprache bietet keine explizite Operationsmethode zum Freigeben von zugewiesenem Speicher.
7. Vorteile und Prinzipien des Müllrecyclings. Und betrachten Sie zwei Recyclingmechanismen.
Ein bemerkenswertes Merkmal der Java-Sprache ist die Einführung eines Garbage-Collection-Mechanismus, der das problematischste Speicherverwaltungsproblem für C++-Programmierer löst. Dadurch müssen Java-Programmierer beim Schreiben von Programmen nicht mehr an die Speicherverwaltung denken. Aufgrund des Garbage-Collection-Mechanismus haben Objekte in Java nicht mehr das Konzept eines „Bereichs“. Nur Verweise auf Objekte haben einen „Bereich“.
Garbage Collection kann Speicherlecks wirksam verhindern und den verfügbaren Speicher effektiv nutzen. Der Garbage Collector wird normalerweise als separater Low-Level-Thread ausgeführt, um Objekte im Speicherheap zu löschen und zu recyceln, die unter unvorhersehbaren Umständen abgestorben sind oder längere Zeit nicht verwendet wurden. Programmierer können den Garbage Collector nicht in Echtzeit aufrufen, um mit bestimmten Objekten umzugehen Objekte. Objekte oder alle Objekte werden durch Müll gesammelt.
Der Recyclingmechanismus umfasst die Garbage Collection für Generationenkopien, die markierte Garbage Collection und die inkrementelle Garbage Collection.
8. Was ist das Grundprinzip des Garbage Collectors? Kann der Garbage Collector den Speicher sofort zurückgewinnen? Gibt es eine Möglichkeit, die virtuelle Maschine aktiv zu benachrichtigen, um die Speicherbereinigung durchzuführen?
Bei GC beginnt der GC, wenn der Programmierer ein Objekt erstellt, die Adresse, Größe und Verwendung des Objekts zu überwachen. Normalerweise verwendet GC einen gerichteten Graphen, um alle Objekte im Heap aufzuzeichnen und zu verwalten. Auf diese Weise wird ermittelt, welche Objekte „erreichbar“ und welche „nicht erreichbar“ sind. Wenn der GC feststellt, dass einige Objekte „nicht erreichbar“ sind, ist der GC für die Rückgewinnung dieser Speicherplätze verantwortlich.
Programmierer können System.gc() manuell ausführen, um den GC zur Ausführung zu benachrichtigen, aber die Java-Sprachspezifikation garantiert nicht, dass der GC ausgeführt wird.
9. Was ist der Unterschied zwischen throw und throws in Java?
throw wird verwendet, um ein instanziiertes Objekt der Klasse java.lang.Throwable auszulösen, was bedeutet, dass Sie eine Ausnahme über das Schlüsselwort throw auslösen können, wie zum Beispiel:
throw new IllegalArgumentException(“XXXXXXXXX″)
Die Rolle von throws ist Teil der Methodendeklaration und -signatur. Die Methode löst die entsprechende Ausnahme aus, damit der Aufrufer sie verarbeiten kann. In Java muss jede nicht behandelte geprüfte Ausnahme zwangsweise in der throws-Klausel deklariert werden.
(Empfohlenes Video-Tutorial: Java-Kurs)
10. Gibt es Speicherlecks in Java? Bitte beschreiben Sie es kurz.
Erklären Sie zunächst, was ein Memory Leak ist: Der sogenannte Memory Leak bedeutet, dass ein Objekt oder eine Variable, die nicht mehr vom Programm verwendet wird, im Speicher belegt wurde. In Java gibt es einen Garbage-Collection-Mechanismus, der sicherstellen kann, dass das Objekt vom Garbage Collector automatisch aus dem Speicher gelöscht wird, wenn auf das Objekt nicht mehr verwiesen wird.
Da Java einen gerichteten Graphen für die Garbage-Collection-Verwaltung verwendet, kann es das Problem der Referenzzyklen beseitigen. Wenn beispielsweise zwei Objekte aufeinander verweisen, kann der GC dies auch, solange sie für den Root-Prozess nicht zugänglich sind recyceln Sie sie.
Speicherlecks in Java: Ein Speicherleck tritt wahrscheinlich auf, wenn ein langlebiges Objekt einen Verweis auf ein kurzlebiges Objekt enthält, obwohl das kurzlebige Objekt nicht mehr benötigt wird, da das langlebige Objekt ihn enthält Die Referenz kann nicht recycelt werden. In Java kann es vorkommen, dass der Programmierer ein Objekt erstellt und es nie wieder verwendet. Das heißt, das Objekt ist nutzlos Es kann vom Garbage Collector nicht recycelt werden. Dies ist die Situation, in der es in Java zu Speicherverlusten kommen kann. Im Cache-System laden wir beispielsweise ein Objekt und legen es in den Cache (z. B. in ein globales Kartenobjekt). und dann ist es nicht mehr verfügbar. Das Objekt wird immer vom Cache referenziert, aber nicht mehr verwendet.
Das obige ist der detaillierte Inhalt vonGrundlegende Fragen zu Java-Hochfrequenzinterviews——(3). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!