JDKのソースコードを正しく読む方法を教えます
この記事では主にjdk自体のソースコードの読み方について説明しますが、各種フレームワークのソースコードの読み方については後ほど説明します。
著者は、ソースコードを読むには主に次の手順が含まれると考えています。
目標の設定
すべてのものには目的があり、ソース コードを読む場合も同様です。
大きな観点から見ると、ソース コードを読む目的は、技術スキルを向上させ、それを仕事に応用し、問題が発生したときにすぐに特定し、昇進や昇給を得るなどです。
小さな観点から見ると、あるソース コードを読む目的は、その原理を理解することであり、真実を探求する執念です。
目的は抽象的、目標は具体的、ソースコードを読む前に自分自身で目標を設定する必要があります。
たとえば、次の章で一緒に学習する ConcurrentHashMap については、次の目標を設定できます:
(1) ConcurrentHashMap のストレージ構造に精通する;
(2) ConcurrentHashMap の主要なメソッドの実装プロセスに精通している;
(3) ConcurrentHashMap で新たに登場している新しいテクノロジを探索する;
質問する
目標としては、何か質問を考え出さなければなりません。
さらに ConcurrentHashMap を例として、著者は次の疑問を提起しました:
(1) ConcurrentHashMap と HashMap のデータ構造は同じですか?
(2) マルチスレッド環境で HashMap に同時実行セキュリティの問題が発生するのはいつですか?
(3) ConcurrentHashMap は同時実行のセキュリティ問題をどのように解決しますか?
(4) ConcurrentHashMap はどのようなロックを使用しますか?
(5) ConcurrentHashMap の展開はどのように行われるのでしょうか?
(6) ConcurrentHashMap は強い一貫性を持っていますか?
(7) ConcurrentHashMap では解決できない問題は何ですか?
(8) 同時実行の安全性に加えて、ConcurrentHashMap は HashMap とどのような違いがありますか? なぜこのように実装する必要があるのですか?
(8) ConcurrentHashMap で学ぶ価値のある珍しいテクノロジは何ですか?
質問の仕方
多くの人は、「私も質問することは知っていますが、どうやって質問すればいいのですか?」と言うでしょう。
これは確かに非常に難しいことですが、ポイントは3つあると思います:
(1) 自分に問いかける
自分を面接官の立場になって自分に問いかけてください。死 尋ねられた種類。
いくつかの質問ができなくても問題ありません。以下をご覧ください。
(2) インターネットに質問する
自分では思いつかなかった質問がたくさんあるので、オンラインにアクセスして関連ブログをチェックし、他の人が質問していないか確認する必要があります。
または、関連する面接の質問についてお問い合わせください。
たとえば、ConcurrentHashMap クラスを学習していたときにオンラインで確認したところ、その多くは jdk7 に基づいていました。その後、jdk8 での ConcurrentHashMap クラスの実装と jdk8 での ConcurrentHashMap クラスの実装の違いは何か、という質問をすることができます。 jdk7? jdk8 は jdk7 に対してどのような最適化を行いましたか?
(3) 問題を発見し続ける
最初はいくつか質問できなくても問題ありません。重要なのは見ることです。見ることでのみ、より多くの問題を見つけることができます。 。
ソース コードを疑問を持ちながら読み、不必要な詳細は無視し、重要な詳細に焦点を当てましょう
まず、ソース コードを疑問を持ちながら読んでください。
第二に、不必要な詳細は必ず無視してください。
繰り返しますが、重要な詳細を必ず守ってください。
一見すると、最後の 2 つの手順は矛盾しているように見えますが、実際には矛盾しません。不必要な詳細を無視することは、ソース コードの世界に迷い込むことを避けるためであり、重要な詳細に焦点を当てることは、ソース コードの内容を明確にすることです。ソースコードの真実。
ここでの詳細を無視するか、それに固執するかは、主に問題との関連性によって決まります。
jdk のソースコードは比較的読みやすいですが、後から Spring のソースコードを見て余計な部分が無視できないと本当に迷ってしまいます。先に伏線を張っておきましょう~~
たとえば、以前に ArrayList のシリアル化関連コードの readObject() メソッドを読みました。
<span style="font-family: 宋体, SimSun;">"s.readInt();"</span>
この作業は何のために行われますか?省略しても大丈夫でしょうか?このとき、シリアル化に関する知識を理解した上で、writeObject()の実装を見るという、死ぬ気で戦わなければならないコードです。
<span style="font-family: 宋体, SimSun;">"SharedSecrets.getJavaOISAccess().checkArray(s, Object[].class, Capacity);"</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(); } } }
さらに比較を行う
jdk ソース コードを読むときは、より多くの比較を行うことも非常に重要です。比較は、水平比較と垂直比較にも分けられます。
(1) 水平比較
は、類似したカテゴリとの比較です。例えばコレクションモジュールでは、基本的に要素の挿入やクエリ、削除などが行われますが、その際にデータ構造や時間計算量などの次元で比較できる、これが水平比較です。
(2) 垂直比較
コレクション開発の歴史から比較できます。たとえば、HashMap の開発履歴は、(単一配列) 実装 (はい、配列を直接使用して HashMap を実装できます)、(複数配列リンク リスト) 実装、(複数配列リンク リスト赤黒ツリー) 実装に至るまでです。 jdk8では、これは垂直方向の比較です。
さらに実験を行う
最後のステップ、最も重要なことは、さらに実験を行うことです。
たとえば、ConcurrentHashMap は強い一貫性を持っていますか?
複数のスレッドを開始して get()、put()、および size() メソッドを継続的に呼び出して、強い一貫性があるかどうかを確認できます。
忍耐と粘り強さ
これについては多くは言いませんが、誰もが知っています。
あなたがどの分野に携わっていても、忍耐力と粘り強さが最も価値のある資質です。
ソースコードを読む場合も同様で、根気よく続けていれば必ず何かが得られます。
[おすすめコース: Java ビデオ チュートリアル ]
以上がJDKのソースコードを正しく読む方法を教えますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。
