Bringen Sie Ihnen bei, den JDK-Quellcode richtig zu lesen
In diesem Artikel geht es hauptsächlich darum, wie man den Quellcode von JDK selbst liest. Wir werden später auf das Lesen des Quellcodes verschiedener Frameworks eingehen.
Der Autor ist der Ansicht, dass das Lesen des Quellcodes hauptsächlich die folgenden Schritte umfasst.
Ziele setzen
Alles hat einen Zweck, und das Gleiche gilt für das Lesen des Quellcodes.
Im Großen und Ganzen besteht der Zweck des Lesens von Quellcode darin, unsere technischen Fähigkeiten zu verbessern, sie bei der Arbeit anzuwenden, Probleme schnell zu lokalisieren, wenn sie auf sie stoßen, Beförderungen und Gehaltserhöhungen zu erhalten usw.
Aus einer kleinen Perspektive besteht der Zweck des Lesens eines bestimmten Quellcodes darin, seine Prinzipien zu verstehen, was die Hartnäckigkeit ist, die Wahrheit zu erforschen.
Der Zweck ist abstrakt und das Ziel ist spezifisch. Wir müssen uns ein Ziel setzen, bevor wir den Quellcode lesen.
Für ConcurrentHashMap, das wir im nächsten Kapitel gemeinsam untersuchen werden, können wir beispielsweise die folgenden Ziele festlegen:
(1) Vertraut mit der Speicherstruktur von ConcurrentHashMap
(2) Vertraut mit dem Implementierungsprozess der Hauptmethoden in ConcurrentHashMap; (3) Entdecken Sie neue Technologien, die in ConcurrentHashMap entstehen.
Stellen Sie Fragen
Das Ziel, wir müssen versuchen, eine Frage zu stellen.
Am Beispiel von ConcurrentHashMap stellte der Autor die folgenden Fragen:
(1) Sind die Datenstrukturen von ConcurrentHashMap und HashMap gleich?
(2) Wann wird HashMap in einer Multithread-Umgebung Probleme mit der Parallelitätssicherheit haben?
(3) Wie löst ConcurrentHashMap Sicherheitsprobleme bei der Parallelität?
(4) Welche Sperren verwendet ConcurrentHashMap?
(5) Wie wird die Erweiterung von ConcurrentHashMap durchgeführt?
(6) Ist ConcurrentHashMap stark konsistent?
(7) Welche Probleme können mit ConcurrentHashMap nicht gelöst werden?
(8) Welche weiteren Unterschiede gibt es zwischen ConcurrentHashMap und HashMap? Warum muss es auf diese Weise implementiert werden?
(8) Welche ungewöhnlichen Technologien sind es wert, in ConcurrentHashMap erlernt zu werden?
Wie man Fragen stellt
Viele Leute werden sagen, ich weiß auch, wie man Fragen stellt, aber wie stellt man Fragen?
Das ist in der Tat eine sehr schwierige Sache. Der Autor meint, dass es drei Hauptpunkte gibt:
(1) Fragen Sie sich selbst
Fragen Sie sich selbst als Interviewer und fragen Sie sich selbst zu Tode . Die Art fragte herein.
Es spielt keine Rolle, wenn Sie sich nicht ein paar Fragen stellen können, siehe unten.
(2) Stellen Sie eine Frage im Internet
Möglicherweise sind Ihnen nicht viele Fragen eingefallen, daher müssen Sie online gehen und in verwandten Blogs nachsehen, ob andere Fragen gestellt haben.
Oder schauen Sie sich die entsprechenden Interviewfragen an.
Als ich zum Beispiel die ConcurrentHashMap-Klasse lernte, habe ich online nachgesehen, dass viele davon auf jdk7 basierten. Dann kann ich eine Frage stellen: Was ist der Unterschied zwischen der Implementierung der ConcurrentHashMap-Klasse in jdk8 und jdk7? Welche Optimierungen hat jdk8 an jdk7 vorgenommen?
(3) Entdecken Sie weiterhin Probleme
Es macht nichts, wenn Sie am Anfang nicht ein paar Fragen stellen können. Der Schlüssel liegt darin, nachzuschauen .
Lesen Sie den Quellcode mit Fragen, ignorieren Sie unnötige Details und bleiben Sie bei den wichtigen Details
Lesen Sie zunächst unbedingt den Quellcode mit Fragen.
Zweitens achten Sie darauf, unnötige Details zu ignorieren.
Achten Sie auch hier darauf, sich auf die wichtigen Details zu konzentrieren.
Auf den ersten Blick scheinen die letzten beiden Schritte widersprüchlich zu sein. Tatsächlich dient das Ignorieren unnötiger Details dazu, sich nicht in der Welt des Quellcodes zu verlieren, und die Konzentration auf wichtige Details dient der Klärung Wahrheit des Quellcodes.
Ob Sie die Details hier ignorieren oder sich daran halten, hängt hauptsächlich von ihrer Relevanz für das Problem ab.
Der JDK-Quellcode ist relativ einfach zu lesen und kann unnötige Details nicht ignorieren. Lassen Sie uns zunächst einen Vorgeschmack geben Ich habe zum Beispiel schon einmal die Methode readObject() im serialisierungsbezogenen Code von ArrayList gelesen.
<span style="font-family: 宋体, SimSun;">"s.readInt();"</span>
"SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, Capacity);" Code>Wozu dient dieser Arbeitsbereich? Auf den ersten Blick scheint es, dass der Code mit Berechtigungen zusammenhängt und nichts mit unserem Problem der „Serialisierung“ zu tun hat. Wenn Sie es wirklich wissen möchten, markieren Sie es zuerst und studieren Sie diese Sache, nachdem das Serialisierungsproblem gelöst ist. <span style="font-family: 宋体, SimSun;">"s.readInt();"</span>
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// 声明为空数组
elementData = EMPTY_ELEMENTDATA;
// 读入非transient非static属性(会读取size属性)
s.defaultReadObject();
// 读入元素个数,没什么用,只是因为写出的时候写了size属性,读的时候也要按顺序来读
s.readInt();
if (size > 0) {
// 计算容量
int capacity = calculateCapacity(elementData, size);
SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacity);
// 检查是否需要扩容
ensureCapacityInternal(size);
Object[] a = elementData;
// 依次读取元素到数组中
for (int i=0; i<size; i++) {
a[i] = s.readObject();
}
}
}
Nach dem Login kopierenMehr Vergleiche durchführen<span style="font-family: 宋体, SimSun;">"SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, capacity);"</span>
Beim Lesen des JDK-Quellcodes ist es auch sehr wichtig, mehr Vergleiche durchzuführen. Vergleiche können auch in horizontale Vergleiche und vertikale Vergleiche unterteilt werden.
(1) Horizontaler Vergleich
dient dem Vergleich mit ähnlichen Klassen. Beispielsweise gibt es im Sammlungsmodul grundsätzlich verschiedene Einfügungen, Abfragen und Löschungen von Elementen. Zu diesem Zeitpunkt können Vergleiche anhand von Dimensionen wie Datenstruktur und Zeitkomplexität durchgeführt werden.
(2) Vertikaler Vergleich
Vergleiche können aus der Geschichte der Sammlungsentwicklung gezogen werden. Zum Beispiel die Entwicklungsgeschichte von HashMap, von der Implementierung (einzelnes Array) (ja, Sie können ein Array direkt zur Implementierung von HashMap verwenden) über die Implementierung (mehrere Arrays + verknüpfte Listen) bis hin zur Implementierung (mehrere Arrays + verknüpfte Listen + Rot-Schwarz). Bäume) in jdk8 Realisierung, dies ist ein vertikaler Vergleich.
Machen Sie mehr Experimente
Der letzte Schritt und das Wichtigste ist, mehr Experimente durchzuführen.
Ist ConcurrentHashMap beispielsweise stark konsistent?
Sie können mehrere Threads starten, um kontinuierlich die Methoden get(), put() und size() aufzurufen, um zu sehen, ob eine starke Konsistenz vorliegt.
Geduld und Beharrlichkeit
Ich werde dazu nicht viel sagen, das weiß jeder.
Egal in welchem Bereich Sie tätig sind, Geduld und Beharrlichkeit sind die wertvollsten Eigenschaften.
Das Gleiche gilt für das Lesen des Quellcodes. Solange Sie geduldig bleiben, werden Sie irgendwann etwas gewinnen.
[Empfohlener Kurs: Java-Video-Tutorial]
Das obige ist der detaillierte Inhalt vonBringen Sie Ihnen bei, den JDK-Quellcode richtig zu lesen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4
