1. Was sind die primitiven Datentypen in Java, ihre Größen und entsprechenden Kapselungsklassen?
(1) boolean
Der boolesche Datentyp ist entweder wahr oder falsch. Dieser Datentyp stellt 1 Bit an Informationen dar, seine Größe ist jedoch nicht genau definiert.
In der „Java Virtual Machine Specification“ heißt es: „Obwohl der boolesche Datentyp definiert ist, bietet er nur eine sehr begrenzte Unterstützung. Es gibt keinen booleschen Wert in der Java Virtual Machine. Dedizierte Bytecode-Anweisungen und boolesche Werte.“ Durch die Java-Sprache betriebene Ausdrücke werden nach der Kompilierung durch den int-Datentyp in der Java Virtual Machine ersetzt und das boolesche Array wird in ein Byte-Array der Java Virtual Machine codiert. Jedes Element belegt 8 Bit. Auf diese Weise können wir schließen, dass der boolesche Typ bei alleiniger Verwendung 4 Byte und in einem Array 1 Byte beträgt. Warum verwendet die virtuelle Maschine int anstelle von boolean? Warum nicht Byte oder Short verwenden? Würde das nicht mehr Speicherplatz sparen? Tatsächlich liegt der Grund für die Verwendung von int darin, dass es für aktuelle 32-Bit-CPUs effizienter ist, jeweils 32-Bit-Daten auszutauschen.
Zusammenfassend können wir Folgendes wissen: Das offizielle Dokument gibt keine genaue Definition des booleschen Typs. Die „Java Virtual Machine Specification“ gibt „4 Bytes bei alleiniger Verwendung und 1 Byte für ein boolesches Array“ an .“ „Die Definition von „ hängt davon ab, ob die Implementierung der virtuellen Maschine den Spezifikationen entspricht, daher sind 1 Byte oder 4 Bytes möglich. Dies ist eigentlich ein Zeit- und Raumkompromiss.
Die Kapselungsklasse vom Typ Boolean ist Boolean.
(2) Byte——1 Byte——Byte
(3) short——2 Bytes——Short
(4) int——4 Bytes—— Ganzzahl
(5) long——8 Bytes——Long
(6) float——4 Bytes——Float
(7) double——8 Bytes— — —Double
(8) char——2 bytes——Character
2. Sprechen wir über den Unterschied zwischen „==“ und „equals()“. .
„Think in Java“ sagt: „Relationale Operatoren generieren ein boolesches Ergebnis und berechnen die Beziehung zwischen den Werten der Operanden.“
„==“ bestimmt, ob die Speicheradressen zweier Objekte gleich sind, und eignet sich für primitive Datentypen und Aufzählungstypen (ihre Variablen speichern den Wert selbst, während Referenztypvariablen Referenzen speichern). ;equals ist Eine Methode der Object-Klasse besteht darin, Speicheradressen zu vergleichen. Wir können diese Methode überschreiben, um das Konzept von „gleich“ anzupassen. Beispielsweise haben String, Date und andere Klassen in der Klassenbibliothek diese Methode neu geschrieben.
Zusammenfassend sollte für Gleichheitsvergleiche zwischen Aufzählungstypen und primitiven Datentypen „==“ verwendet werden, für Gleichheitsvergleiche zwischen Referenztypen sollte die Methode „equals“ verwendet werden.
3. Welche vier Arten von Referenzen gibt es in Java und ihre Anwendungsszenarien?
Starke Referenz: Normalerweise ist die Referenz, die zurückgegeben wird, wenn wir den neuen Operator zum Erstellen eines Objekts verwenden, eine starke Referenz.
Weiche Referenz: Wenn ein Objekt nur über eine weiche Referenz erreicht werden kann, dann ist die Das Objekt wird recycelt, wenn der Speicher nicht ausreicht, und kann im Bildcache verwendet werden. Wenn der Speicher nicht ausreicht, recycelt das System automatisch die Bitmap, die nicht mehr verwendet wird.
Schwache Referenz: Wenn ein Objekt vorhanden ist Kann nur über eine schwache Referenz erreicht werden, dann wird es recycelt (Auch wenn der Speicher ausreicht), kann es zu diesem Zeitpunkt auch im Bildcache verwendet werden, solange die Bitmap nicht mehr verwendet wird recycelt
Virtuelle Referenz: Virtuelle Referenz ist die „schwächste“ Referenz in Java und kann nicht einmal über sie abgerufen werden. Der einzige Zweck eines referenzierten Objekts besteht darin, dass das Objekt, auf das es verweist, recycelt wird zur Referenzwarteschlange hinzugefügt werden, damit wir wissen, wann das Objekt, auf das es verweist, zerstört wird.
4. Welche Methoden sind im Objekt definiert?
clone(), equal(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()
5. Welche Funktion hat HashCode?
Bitte beachten Sie die Grundprinzipien und die Implementierung von Hash-Tabellen
6. Was sind die Unterschiede zwischen ArrayList, LinkedList und Vector?
ArrayList: Verwendet intern Arrays zum Speichern von Elementen, unterstützt effizienten Direktzugriff und unterstützt die dynamische Größenänderung
LinkedList: Verwendet intern verknüpfte Listen zum Speichern von Elementen, unterstützt das schnelle Einfügen/Löschen von Elementen, tut dies aber unterstützt keinen effizienten Direktzugriff
Vector: kann als threadsichere Version von ArrayList angesehen werden
7 Was ist der Unterschied zwischen String, StringBuilder und StringBuffer?
String: Unveränderliche Zeichenfolge, um neue Zeichen hinzuzufügen, müssen Sie ein neues String-Objekt erstellen
StringBuilder: Variable Zeichenfolge, unterstützt das Hinzufügen neuer Zeichen (keine Notwendigkeit, ein neues Objekt zu erstellen)
StringBuffer: kann als threadsichere Version von StringBuilder angesehen werden
8. Eigenschaften und Verwendung von Map, Set, List, Queue und Stack.
Map
Set
Liste
Warteschlange
Stack
Ausführlichere Anweisungen finden Sie in der offiziellen Dokumentation. Studierende, die mit relevanten Datenstrukturen nicht vertraut sind, können auf „Einführung in Algorithmen“ oder andere verwandte Bücher zurückgreifen.
9. Der Unterschied zwischen HashMap und HashTable
HashTable ist threadsicher, HashMap jedoch nicht.
HashMap erlaubt Nullschlüssel und Nullwerte.
ist jedoch in HashTable nicht zulässig. Eine ausführlichere Analyse finden Sie in der ausführlichen Analyse von HashMap und HashTable
10. Das Implementierungsprinzip von HashMap
Einfach ausgedrückt ist die zugrunde liegende Implementierung von HashMap eine „Zipper-basierte Hash-Tabelle“. Eine detaillierte Analyse finden Sie in der ausführlichen Analyse von HashMap und HashTable
11 Das Implementierungsprinzip von ConcurrentHashMap
ConcurrentHashMap ist eine HashMap, die gleichzeitiges Lesen und unterstützt Beim Schreiben ist es charakteristisch, dass beim Lesen von Daten keine Sperre erforderlich ist und die Sperrgranularität beim Schreiben von Daten so gering wie möglich gehalten werden kann. Da intern „segmentierter Speicher“ verwendet wird, müssen Sie nur das „Segment“ sperren, in dem sich die zu schreibenden Daten befinden. Eine detaillierte Analyse der zugrunde liegenden Implementierung von ConcurrentHashMap finden Sie unter Java Concurrent Programming: Concurrent Container ConcurrentHashMap
12. Was ist der Unterschied zwischen TreeMap, LinkedHashMap und HashMap?
Die zugrunde liegende Implementierung von HashMap ist eine Hash-Tabelle, sodass die darin gespeicherten Elemente ungeordnet sind.
Die zugrunde liegende Implementierung von TreeMap ist ein rot-schwarzer Baum, sodass die darin enthaltenen Elemente geordnet sind . Die Sortierung basiert auf der natürlichen Reihenfolge oder dem beim Erstellen der TreeMap bereitgestellten Comparator-Objekt.
LinkedHashMap kann sich die Reihenfolge merken, in der Elemente eingefügt werden.
Eine ausführlichere Erklärung finden Sie unter den Unterschieden zwischen HashMap, LinkedMap und TreeMap
13 Was ist der Unterschied zwischen Collection und Collections?
Collection
Für diejenigen, die mit dem Java Collection Framework nicht vertraut sind, lesen Sie bitte das Collection Framework of Java Core Technology Points
14. Wenn der Try-Anweisungsblock eine „Return“-Anweisung enthält, wird der Final-Anweisungsblock ausgeführt.
Die Antwort ist ja. Es gibt nur zwei Situationen, in denen die Anweisungen im „finally“-Block nicht ausgeführt werden:
Die Methode System.exit() wird aufgerufen
Die JVM „stürzt ab“.
15. Ausnahmehierarchie in Java
Die Ausnahmehierarchie in Java ist wie folgt:
Wir können sehen, dass die Throwable-Klasse die Basisklasse in der Ausnahmehierarchie ist. Die Error-Klasse stellt interne Fehler dar, die außerhalb unserer Kontrolle liegen, und RuntimeException und ihre Unterklassen sind ungeprüfte Ausnahmen. Zu diesen Ausnahmen gehören ArrayIndexOutOfBoundsException usw. Wir sollten ungeprüfte Ausnahmen durch bedingte Beurteilungen und andere Anweisungen vermeiden. IOException und seine Unterklassen sind geprüfte Ausnahmen. Der Compiler prüft, ob wir Ausnahmehandler für alle geprüften Ausnahmen bereitgestellt haben, die möglicherweise ausgelöst werden. Ungeprüfte Ausnahmen müssen wir nicht abfangen (natürlich erlaubt uns Java auch, sie abzufangen, aber wir sollten das Auftreten ungeprüfter Ausnahmen vermeiden).
16. Drei Merkmale und Bedeutungen von Java-Objektorientierung
Drei Hauptmerkmale: Kapselung, Vererbung und Polymorphismus. Für eine detaillierte Einführung klicken Sie bitte auf die drei Hauptfunktionen von Java Object Oriented
17. Die Bedeutung und der Unterschied von Override und Overload
Override bedeutet „Überschreiben“. Dies ist das Umschreiben der übergeordneten Klasse durch die Unterklasse. Neudefinition derselben Methode in
Überladen bedeutet „Überladen“, dh das Definieren einer neuen Methode mit demselben Namen wie die definierte Methode, aber einer anderen Signatur
18. Der Unterschied zwischen Schnittstelle und abstrakter Klasse
Schnittstelle ist eine Konvention, und die Klasse, die die Schnittstelle implementiert, muss dieser abstrakten Klasse folgen. und die Kosten für die Verwendung einer abstrakten Klasse sind höher als die einer Schnittstelle. Der Vergleich zwischen Schnittstellen und abstrakten Klassen ist wie folgt:
Abstrakte Klassen können Attribute, Methoden (einschließlich abstrakter Methoden und Methoden mit bestimmten Implementierungen) enthalten, und Konstanten können nur Konstanten und Methodendeklarationen enthalten.
Methoden und Mitgliedsvariablen in abstrakten Klassen können die Sichtbarkeit definieren (z. B. öffentlich, privat usw.), während Methoden in Schnittstellen nur öffentlich sein können (der Standardwert ist öffentlich).
Eine Unterklasse kann nur eine übergeordnete Klasse haben (konkrete Klasse oder abstrakte Klasse); eine Schnittstelle kann mehrere Schnittstellen erben, und eine Klasse kann auch mehrere Schnittstellen implementieren.
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).
19. Der Unterschied zwischen statischen inneren Klassen und nicht statischen inneren Klassen
Statische innere Klassen enthalten keine Verweise auf äußere Klassen, nicht statische innere Klassen hingegen schon Enthält implizit einen Verweis auf die umschließende Klasse.
Um mehr über interne Klassen zu erfahren, klicken Sie bitte auf Interne Klassen von Java Core Technology Points
20. Das Implementierungsprinzip des Polymorphismus in Java
Der sogenannte Polymorphismus-Status bedeutet, dass die Referenz der übergeordneten Klasse auf das Objekt der untergeordneten Klasse verweist. Beim Aufruf einer Methode wird die Implementierung der untergeordneten Klasse anstelle der Implementierung der übergeordneten Klasse aufgerufen. Der Schlüssel zur Implementierung des Polymorphismus liegt in der „dynamischen Bindung“. Für eine detaillierte Einführung klicken Sie bitte auf den internen Implementierungsmechanismus der dynamischen Java-Bindung
21. Beschreiben Sie kurz die beiden Methoden zum Erstellen neuer Threads in Java
Erben Sie den Thread Klasse (unter der Annahme von Unterklassen für MyThread) und schreiben Sie die run()-Methode neu, erstellen Sie dann ein neues MyThread-Objekt und rufen Sie start() darauf auf, um einen neuen Thread zu starten.
Implementieren Sie die Runnable-Schnittstelle (vorausgesetzt, die Implementierungsklasse ist MyRunnable), übergeben Sie dann das MyRunnable-Objekt als Parameter an den Thread-Konstruktor und rufen Sie die start()-Methode für das erhaltene Thread-Objekt auf.
22. Beschreiben Sie kurz die Methode der Thread-Synchronisierung in Java
flüchtig: Das Java-Speichermodell stellt sicher, dass das Schreiben in dieselbe flüchtige Variable erfolgt, bevor sie gelesen wird
synchronisiert: Sie können einen Codeblock oder eine Methode sperren, die als kritischer Abschnitt bezeichnet wird. Der Thread, der den kritischen Abschnitt betritt, erhält den Monitor des Objekts, sodass andere Versuche, den kritischen Abschnitt zu betreten, erhalten Der Thread in diesem Bereich wird blockiert, da er den Monitor nicht erhalten kann. Ein Thread, der blockiert ist und darauf wartet, dass ein anderer Thread einen Monitor freigibt, kann nicht unterbrochen werden. ReentrantLock: Der Thread, der versucht, die Sperre zu erhalten, kann unterbrochen und der Timeout-Parameter festgelegt werden. Für eine detailliertere Einführung klicken Sie bitte auf die wichtigsten technischen Punkte von Java - Multithreading 23 Beschreiben Sie kurz die Arten von Granular-Sperren in Java In Java können Klassen, Objekte, Methoden oder Codeblöcke gesperrt werden. Für eine detailliertere Einführung klicken Sie bitte auf Java Core Technology Points Multithreading 24. Geben Sie eine Lösung für das „Producer-Consumer“-Problem Verwenden Sie die Blockierungswarteschlange:public class BlockingQueueTest { private int size = 20; private ArrayBlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(size); public static void main(String[] args) { BlockingQueueTest test = new BlockingQueueTest(); Producer producer = test.new Producer(); Consumer consumer = test.new Consumer(); producer.start(); consumer.start(); } class Consumer extends Thread{ @Override public void run() { while(true){ try { //从阻塞队列中取出一个元素 queue.take(); System.out.println("队列剩余" + queue.size() + "个元素"); } catch (InterruptedException e) { } } } } class Producer extends Thread{ @Override public void run() { while (true) { try { //向阻塞队列中插入一个元素 queue.put(1); System.out.println("队列剩余空间:" + (size - queue.size())); } catch (InterruptedException e) { } } } } }
25. Das Designkonzept und die Rolle von ThreadLocal
Die Rolle von ThreadLocal besteht darin, lokale Variablen innerhalb eines Threads bereitzustellen, wodurch sichergestellt werden kann, dass die ThreadLocal-Variablen in jedem Thread unabhängig sind, wenn in einem darauf zugegriffen wird Multi-Thread-Umgebung. Mit anderen Worten: Die ThreadLocal-Variable jedes Threads ist für sich selbst reserviert und kann von anderen Threads nicht aufgerufen werden. ThreadLocal wird am häufigsten im folgenden Szenario verwendet: Es gibt gleichzeitige Zugriffe auf nicht-threadsichere Objekte in einer Multithread-Umgebung, und das Objekt muss nicht von Threads gemeinsam genutzt werden, wir möchten jedoch nicht sperren In diesem Fall kann ThreadLocal verwendet werden, damit jeder Thread eine Kopie dieses Objekts verwaltet.
Für eine Analyse der Implementierungsprinzipien von ThreadLocal klicken Sie bitte für eine ausführliche Analyse von ThreadLocal
Die Gesamtarchitektur des gleichzeitigen Pakets
27. ArrayBlockingQueue, CountDownLatch Die Rolle der Klasse
CountDownLatch: Ermöglicht einer Reihe von Threads, zu warten, bis der Zähler 0 erreicht. Anwendbares Szenario: Wenn ein oder mehrere Threads auf das Eintreten einer bestimmten Anzahl von Ereignissen warten müssen, bevor sie mit der Ausführung fortfahren.
ArrayBlockingQueue: Eine Blockierungswarteschlange basierend auf der Array-Implementierung, die beim Erstellen die Kapazität angeben muss. Der aktuelle Thread wird blockiert, wenn versucht wird, Elemente zu einer vollen Warteschlange hinzuzufügen oder Elemente aus einer leeren Warteschlange zu entfernen. Über die Blockierungswarteschlange können wir im folgenden Modus arbeiten: Der Arbeitsthread kann die Zwischenergebnisse regelmäßig in die Blockierungswarteschlange stellen, und andere Threads können die Zwischenergebnisse herausnehmen und weitere Vorgänge ausführen. Wenn der Arbeitsthread langsam ausgeführt wird (bevor er Zeit hat, Elemente in die Warteschlange einzufügen), warten andere Threads, die Elemente aus der Warteschlange übernehmen, darauf (und versuchen, Elemente aus der leeren Warteschlange zu übernehmen und zu blockieren, wenn der Arbeitsthread schnell ausgeführt wird). (Wenn Sie versuchen, ein Element in eine volle Warteschlange einzufügen), wartet es, bis andere Threads das Element entfernen, bevor es fortfährt.
28. Der Unterschied zwischen wait() und sleep()
wait(): In der Object-Klasse definierte Instanzmethode. Durch Aufrufen der Wartemethode für das angegebene Objekt wird der aktuelle Thread in einen Wartezustand versetzt (vorausgesetzt, der aktuelle Thread hält den Monitor des Objekts. Zu diesem Zeitpunkt gibt der aktuelle Thread den Monitor des entsprechenden Objekts frei, sodass andere Threads haben die Möglichkeit, den Objektmonitor zu erhalten. Wenn andere Threads den Monitor dieses Objekts abrufen und die erforderlichen Vorgänge ausführen, können sie die Benachrichtigungsmethode aufrufen, um den Thread aufzuwecken, der zuvor in den Wartezustand eingetreten ist.
sleep(): Statische Methode in der Thread-Klasse, die verwendet wird, um den aktuellen Thread in den Ruhezustand zu versetzen, damit andere Threads die Möglichkeit zur Ausführung haben. Ein Thread, der in den Ruhezustand wechselt, gibt die von ihm gehaltene Sperre nicht frei.
29. Verwendung und Vorteile des Thread-Pools
Vorteile: Erkennen Sie die Wiederverwendung von Threads und vermeiden Sie den Aufwand für das wiederholte Erstellen und Zerstören von Threads Eine einheitliche Verwaltung von Threads kann die Anzahl gleichzeitiger Threads reduzieren, aber zu viele Threads verschwenden tendenziell zu viel Zeit für den Thread-Kontextwechsel und die Thread-Synchronisierung.
Verwendung: Wir können eine Konstruktormethode von ThreadPoolExecutor aufrufen, um selbst einen Thread-Pool zu erstellen. Normalerweise können wir jedoch die von der Executors-Klasse bereitgestellte statische Factory-Methode verwenden, um ein Thread-Pool-Objekt bequemer zu erstellen. Nach dem Erstellen des Thread-Pool-Objekts können wir die Submit-Methode aufrufen, um die Aufgabe zur Ausführung an den Thread-Pool zu senden. Nachdem der Thread-Pool verwendet wurde, müssen wir daran denken, die Shutdown-Methode aufzurufen, um ihn zu schließen.
Für eine detaillierte Einführung in den Thread-Pool und eine Analyse der Implementierungsprinzipien klicken Sie bitte auf „Ausführliches Verständnis des Java-Thread-Pools“
30 von for-each und konventionellen for-Schleifen
Zu dieser Frage schauen wir uns direkt die Antwort an, die uns „Effective Java“ gegeben hat:
for-each能够让代码更加清晰,并且减少了出错的机会。下面的惯用代码适用于集合与数组类型: for (Element e : elements) { doSomething(e); }使用for-each循环与常规的for循环相比,并不存在性能损失,即使对数组进行迭代也是如此。实际上,在有些场合下它还能带来微小的性能提升,因为它只计算一次数组索引的上限。
31. Beschreiben Sie kurz den Unterschied zwischen Java IO und NIO
Java IO ist Stream-orientiert, was bedeutet, dass wir jeweils ein oder mehrere Bytes aus dem Stream lesen müssen, bis alle Bytes gelesen wurden; NIO ist pufferorientiert Die Daten werden in einen Puffer eingelesen und dann werden die Daten im Puffer entsprechend verarbeitet.
Java IO blockiert IO, während NIO nicht blockierendes IO ist.
In Java NIO gibt es einen sogenannten Selektor, der es Ihnen ermöglicht, mehrere Kanäle bei einem Selektor zu registrieren und dann einen Thread zum Überwachen dieser Kanäle zu verwenden: Wenn sich etwas in diesen Kanälen befindet. Wenn der Kanal bereit ist, mit dem Lesen zu beginnen, oder Schreibvorgänge starten das Lesen und Schreiben des entsprechenden Kanals. Während er darauf wartet, dass ein Kanal lesbar/beschreibbar wird, kann der Thread, der Lese- und Schreibvorgänge auf dem Kanal anfordert, andere Dinge tun.
Für weitere Erklärungen klicken Sie bitte auf Java NIO und IO
32 Die Rolle und das Prinzip der Reflexion
Die Rolle der Reflexion ist im Allgemeinen: Laufzeit Rufen Sie verschiedene Definitionsinformationen der Klasse ab, z. B. welche Attribute und Methoden definiert sind. Das Prinzip besteht darin, über ihr Klassenobjekt verschiedene Informationen über eine Klasse zu erhalten.
Eine ausführliche Einführung finden Sie unter Reflection, dem technischen Kernpunkt von Java
33.Generischer Mechanismus in Java
Eine ausführliche Einführung Zum generischen Mechanismus werfen Sie bitte einen Blick auf die technischen Kernpunkte von Java: Generics
34 Neue Funktionen von Java 7 und Java 8
Hier sind zwei sehr gute Zusammenfassungen: Neue Funktionen von Java 7 Neue Funktionen von Java 8
35. Gängige Designmuster
Die sogenannten „Designmuster“ sind nur einige häufig verwendete Software-Designtechniken in der objektorientierten Programmierung und Nach praktischen Tests können diese Entwurfstechniken einige Anforderungen in ihren jeweiligen Szenarien lösen, sodass sie heute zu weit verbreiteten „Entwurfsmustern“ geworden sind. Mit anderen Worten: Offiziell wurden die entsprechenden Entwurfsmuster geboren, weil in bestimmten Szenarien einige heikle Probleme auftraten. Nachdem wir dies klargestellt haben, müssen wir beim Erlernen eines bestimmten Entwurfsmusters den Hintergrund seiner Entstehung und die Hauptwidersprüche, die es löst, vollständig verstehen.
Häufig verwendete Entwurfsmuster können in die folgenden drei Kategorien unterteilt werden:
Kreative Muster: einschließlich Fabrikmuster (die weiter in einfache Fabrikmuster, Fabrikmethodenmuster und abstrakte Fabrikmuster unterteilt werden können). ), Builder-Muster, Singleton-Muster.
Strukturmodus: einschließlich Adaptermodus, Brückenmodus, Dekorationsmodus, Erscheinungsmodus, Fliegengewichtsmodus und Proxy-Modus.
Verhaltensmuster: einschließlich Befehlsmodus, Vermittlermodus, Beobachtermodus, Zustandsmodus und Strategiemodus.
Eine detaillierte Einführung in jeden Modus finden Sie im illustrierten Entwurfsmuster
36. Grundlegende Verwendung von JNI
Bezüglich JNI finden Sie hier Ein guter Artikel: JNI in Android
37. Die Definition, Anwendungsszenarien und Prinzipien des dynamischen Proxys
Informationen zum dynamischen Proxy finden Sie direkt im dynamischen Proxy von Java Kerntechnologiepunkte
38. Das Grundkonzept und die Verwendung von Anmerkungen
Anmerkungen können als „erweiterte Versionen von Kommentaren“ betrachtet werden, die dem Compiler einige Dinge erklären können und virtuelle Maschine.
Anmerkungen sind Codes, die Java-Code beschreiben. Sie können vom Compiler analysiert werden, und Anmerkungsverarbeitungstools können Anmerkungen auch zur Laufzeit analysieren. Die Anmerkung selbst stellt eine „passive“ Information dar und ist nur dann sinnvoll, wenn sie aktiv analysiert wird.
Zusätzlich zur Weitergabe von Informationen an den Compiler/die virtuelle Maschine können wir Annotationen auch verwenden, um „vorgefertigten“ Code zu generieren.
Reichen diese? Natürlich nicht genug. Oben sind häufige Fragen zu Java in Interviews aufgeführt, und die meisten davon sind auch die wichtigsten technischen Punkte des Java-Technologiesystems. Die durch diese Fragen aufgeworfenen Fragen zeigen uns einen Weg auf, wie wir unser eigenes Wissenssystem verbessern können Das Beste ist, diesen Weg weiterzugehen :)
Weitere Zusammenfassungen der Java-Interview-Wissenspunkte und verwandte Artikel finden Sie auf der chinesischen PHP-Website!