Java新人供給ステーション-一般的なインタビューの短い回答の質問(2)

目次

1.リスト3の3つのサブカテゴリの特徴

2.リスト、マップ、セットの違い

3. HashMapとHashTableの違いは何ですか?

4.配列とリンクリストの違い

5.リンクリストとアレイの使用シナリオ

6. JavaのArrayListとLinkedlistの違いは何ですか?

7.あなたが知っているデザインパターンは何ですか

8.ヒープとスタックの違いは何ですか

9. GCメカニズムがあるのに、なぜまだメモリリークがあるのですか 

10 JavaにGCメカニズムがあるのはなぜですか? 

11JavaGCでリサイクルする必要のあるメモリ

12. Java GCはいつガベージコレクションを行いますか?

13.ネイティブjdbc操作データベースプロセスについて話しますか?

14. PreparedStatementは何を使用すればよいですか? 

15.リレーショナルデータベースの接続プールのメカニズムは何ですか?

16.マップのキーと値をnullにすることはできますか?

17. Javaの参照型は何ですか?(重要)


1.リスト3の3つのサブカテゴリの特徴

  • ArrayListの基礎となる構造は配列であり、基礎となるクエリは高速で、追加と削除は低速です。
  • LinkedListの基本構造はリンクリストであり、追加と削除が速く、クエリが遅くなります。
  • voctorの基本構造は、配列のスレッドセーフであり、追加、削除、およびクエリが遅くなります。

2.リスト、マップ、セットの違い


2.1構造的特徴

  • ListとSetは単一列のデータを格納するコレクションであり、Mapはキーや値などの2列のデータのコレクションです。
  • リストに格納されているデータは順序どおりであり、繰り返しが許可されています。マップに格納されているデータは順序がなく、キーを繰り返すことはできず、値を繰り返すことができます。
  • セットに格納されているデータは順序付けられておらず、繰り返しは許可されていませんが、セット内の要素の位置は要素のハッシュコードによって決定され、位置は固定されています(セットコレクションはハッシュコードに従ってデータを格納するため、位置は固定されていますが、位置はユーザーが制御できないため、セット内の要素はユーザーにとってまだ順序が狂っています。

2.2実装クラス

  • リストインターフェイスには3つの実装クラスがあります(LinkedList:リンクリストの実装に基づいて、リンクリストのメモリは分散され、各要素は独自のメモリアドレスを格納しますが、次の要素のアドレスも格納します。リンクリストはすばやく追加および削除されます、検索が遅い; ArrayList:アレイの実装に基づく、スレッドセーフではない、高効率、インデックス作成は簡単だが、挿入と削除は簡単ではない; Vector:アレイの実装に基づく、スレッドセーフ、低効率) 。
  • Mapインターフェースには3つの実装クラスがあります(HashMap:ハッシュテーブルに基づくMapインターフェースの実装、非スレッドセーフ、効率的、null値とnullキーをサポート; HashTable:スレッドセーフ、非効率的、 null値とnullキーをサポートしていません; LinkedHashMap:はHashMapのサブクラスであり、レコードの挿入順序を保存します; SortMapインターフェイス:TreeMapは、保存したレコードをキーに従って並べ替えることができます。デフォルトはの昇順です。キー値)。
  • Setインターフェースには2つの実装クラスがあります(HashSet:最下層はHashMapによって実装され、セット内の重複値は許可されていません。このメソッドを使用する場合は、equals()とhashCode(methods; LinkedHashSet:inherit HashSetから、またLinkedHashMapに基づいて実装するために、最下層はLinkedHashMpを使用します。

2.3違い

  • Listコレクション内のオブジェクトはインデックス位置に従ってソートされ、重複するオブジェクトが存在する可能性があります。たとえば、list.get()を使用して、コレクション内のオブジェクトのインデックス位置に従ってオブジェクトを取得できます。コレクション内の要素を取得するメソッド。
  • マップの各要素には、ペアで表示されるキーと値が含まれ、キーオブジェクトを繰り返すことはできず、値オブジェクトを繰り返すことができます。
  • Setコレクション内のオブジェクトは特定の方法で並べ替えられておらず、重複するオブジェクトはありませんが、その実装クラスはコレクション内のオブジェクトを特定の方法で並べ替えることができます。たとえば、TreeSetクラスはデフォルトの順序に従うか、実装できます。 Java.util。.Comparator<Type>インターフェースは、ソート方法をカスタマイズします。


3. HashMapとHashTableの違いは何ですか?

  • HashMapはスレッドセーフではありません。HashMapはMapのインターフェイスおよびサブインターフェイスです。キーを価値のあるオブジェクトにマップします。キー値を繰り返すことはできません。空のキーと空の値は許可されます。 -スレッドセーフ、HashMapがより効率的HashTableがより効率的
  • HashTableはスレッドセーフなコレクションであり、null値をキー値または値値として使用することはできません; HashTableは同期されており、複数のスレッドによってアクセスされたときにメソッドを同期する必要はありませんが、HashMapはによってアクセスされます複数のスレッド。メソッドを自分で同期する必要があります。
     

4.配列とリンクリストの違い

 

  • 配列は要素をメモリに連続的に格納します;その利点:データは連続的に格納され、メモリアドレスは連続的であるため、データを探すときに効率的です;その欠点:格納する前に適用する必要があります-連続ブロックメモリスペース、およびそのスペースのサイズは、コンパイル時に決定する必要があります。実行中は、増減する必要があるため、スペースのサイズを変更できません。データが比較的大きい場合は範囲​​外になる可能性があります。データが比較的小さい場合は無駄になる可能性があります。メモリスペース。データ数を変更する場合、データの追加、挿入、削除の効率は比較的低くなります。
  • リンクリストはメモリスペースに動的に適用されます。配列のように事前にメモリのサイズを申請する必要はありません。リンクリストを使用する場合にのみ申請する必要があります。メモリスペースを動的に適用または削除します。ニーズ。データの追加、削除、挿入に関しては、配列よりも柔軟性があります。リンクリスト内のデータはメモリ内の任意の場所に配置でき、データはアプリケーションを介して関連付けることができます(つまり、既存の要素のポインタが接続されます)。


5.リンクリストとアレイの使用シナリオ

 

  • 配列アプリケーションのシナリオ:データは比較的小さいです。よく行われる操作は、シーケンス番号でデータ要素にアクセスすることです。配列は実装が簡単で、高級言語でサポートされています。構築された線形テーブルはより安定しています。
  • リンクリストアプリケーションのシナリオ:線形リストの長さやスケールを見積もるのは困難です。頻繁に挿入および削除操作を行い、動的線形リストを作成します。
     

6. JavaのArrayListとLinkedlistの違いは何ですか?

  • ArrayListとVectorは配列の実装を使用します。ArrayListまたはVectorは、新しい要素の追加、削除、挿入、データの展開や配列へのリダイレクトなど、内部配列に対する操作をカプセル化すると見なすことができます。
  • LinkedListは、循環二重リンクリストデータ構造を使用します。配列ベースのArrayListと比較すると、これらは2つの完全に異なる実装テクノロジであり、完全に異なる作業シナリオに適していることも決定します。
     

7.あなたが知っているデザインパターンは何ですか

 

  • Javaでは、一般に23のデザインパターンがあると考えられており、すべてを必要とするわけではありませんが、一般的に使用されるいくつかのデザインパターンを習得する必要があります。すべてのデザインパターンを以下に示します。もちろん、個別に習得する必要のあるデザインパターンをリストアップしましたが、習得できるほど優れています。
  • 一般的に、デザインパターンは次の3つのカテゴリに分類されます。
  • 作成モードには、ファクトリメソッドモード、抽象ファクトリモード、シングルトンモード、ビルダーモード、プロトタイプモードの5つがあります。
  • 構造モードには、アダプタモード、デコレータモード、エージェントモード、アピアランスモード、ブリッジモード、コンビネーションモード、フライウェイトモードの7つがあります。
  • 行動モードには、ストラテジーモード、テンプレートメソッドモード、オブザーバーモード、反復サブモード、責任チェーンモード、コマンドモード、メモモード、状態モード、ビジターモード、中間モード、インタープリターモードの10種類があります。
     

8.ヒープとスタックの違いは何ですか

 

  • ヒープとスタックの違いを次の観点から説明してください。

1.申し込み方法

  • スタック:システムによって自動的に割り当てられます。たとえば、関数でローカル変数int bを宣言すると、システムはスタック内のbのスペースを自動的に開きます。プログラマーはそれを申請してサイズを指定する必要があります。Cのmalloc関数では、手動で開く必要があります。 Java用の新しいObject()の形式で。

2.適用後のシステム応答

  • スタック:スタックの残りのスペースが要求されたスペースよりも大きい限り、システムはプログラムにメモリを提供します。それ以外の場合は、スタックのオーバーフローを示す例外が報告されます。
     
  • ヒープ:まず、オペレーティングシステムには、空きメモリアドレスを記録するリンクリストがあることを知っておく必要があります。システムがプログラムのアプリケーションを受信すると、リンクリストをトラバースして、スペースがより大きい最初のヒープノードを見つけます。要求されたスペースを選択し、からノードを開始します。空きノードリストが削除され、ノードのスペースがプログラムに割り当てられます。さらに、検出されたヒープノードのサイズがアプリケーションのサイズと正確に等しくない可能性があるため、システムは自動的に余分な部分を空きリストに追加します。

3.アプリケーションサイズの制限

  • スタック:スタックは、下位アドレスに拡張されるデータ構造であり、メモリの連続した領域です。この文は、スタックの最上位のアドレスとスタックの最大容量がシステムによって事前定義されていることを意味します。WINDOWSでは、スタックのサイズは2Mです(つまり、1Mと言われます。コンパイル時に定数が決定されます。適用する場合スペースがスタックの残りのスペースを超えると、オーバーフローが促されます。したがって、スタックから取得できるスペースは小さくなります。
  • ヒープ:ヒープは、上位アドレスに拡張されるデータ構造であり、不連続なメモリ領域です。これは、システムがリンクリストを使用して空きメモリアドレスを格納するためです。空きメモリアドレスは自然に不連続であり、リンクリストの走査方向は下位アドレスから上位アドレスへです。ヒープのサイズは、コンピュータシステムの有効な仮想メモリによって制限されます。それを見ることができます
     

9. GCメカニズムがあるのに、なぜまだメモリリークがあるのですか 

 

  • 理論的には、Javaにはガベージコレクションメカニズム(GC)があるため、メモリリークの問題はありません(これは、Javaがサーバー側プログラミングで広く使用されている重要な理由でもあります)。ただし、実際の開発では、役に立たないが到達可能なオブジェクトが存在する可能性があります。これらのオブジェクトはGCで再利用できないため、メモリリークが発生する可能性もあります。
  • たとえば、Hibernateのセッション(レベルキャッシュ)内のオブジェクトは永続状態にあり、ガベージコレクターはこれらのオブジェクトを再利用しません。ただし、これらのオブジェクトには役に立たないガベージオブジェクトが含まれている可能性があります。 close)またはempty(flush))-レベルキャッシュはメモリリークにつながる可能性があります。
     

10 JavaにGCメカニズムがあるのはなぜですか? 

  • セキュリティに関する考慮事項;-セキュリティのため。
  • メモリリークを減らします;-メモリリークをある程度消去します。
  • プログラマーの作業負荷を軽減します。-プログラマーはメモリの解放について心配する必要はありません。
     

11JavaGCでリサイクルする必要のあるメモリ

  • メモリが実行されているとき、JVMにはメモリを管理するためのランタイムデータ領域があります。これには主に、プログラムカウンタレジスタ、仮想マシンスタック(VMスタック)、ネイティブメソッドスタック、およびメソッド領域(メソッド領域)の5つの部分が含まれます。 (ヒープ)その中で、プログラムカウンター、仮想マシンスタック、ローカルメソッドスタックは、各スレッドのプライベートメモリスペースであり、スレッドとともに生成され、終了します。
  • たとえば、スタック内の各スタックフレームに割り当てられるメモリの量は、基本的にクラス構造が決定されるときにわかります。したがって、これら3つの領域のメモリ割り当てと回復が決定され、メモリの問題を考慮する必要はありません。回復。
  • ただし、メソッド領域とヒープは異なります。インターフェイスの複数の実装クラスに必要なメモリは異なる場合があります。プログラムの実行中に作成されるオブジェクトのみがわかります。メモリのこの部分の割り当てと回復GC主な関心事はメモリのこの部分です。全体として、GCが主に再利用するメモリは、JVMのメソッド領域とヒープです。
     

12. Java GCはいつガベージコレクションを行いますか?

 

  • インタビューでは、私たちはしばしばそのような問題に遭遇します(実際、著者もそれに遭遇しました):被験者が死亡したと判断する方法は?
  • 考えやすい答えの1つは、オブジェクトに参照カウンターを追加することです。参照がある場合は常にカウンター値が1増加し、参照が無効な場合はカウンター値が1減少します。カウンターの値が0の場合、オブジェクトは使用されなくなります。死んだと判断された。シンプルで直感的ですか。しかし、それは残念です。このアプローチは間違っています!なぜ間違っているのですか?実際、参照カウントを使用することはほとんどの場合実際に良い解決策であり、実際のアプリケーションでは多くの場合がありますが、オブジェクト間の循環参照の問題を解決することはできません。たとえば、オブジェクトAにはオブジェクトBを指すフィールドがあり、オブジェクトBにもオブジェクトAを指すフィールドがあり、実際には使用されなくなりましたが、カウンターの値を0にすることはできません。 、したがって、リサイクルではなく、メモリリークが発生しました。
  • それで、正しいアプローチは何である必要がありますか?
  • Java、C#、およびその他の言語では、オブジェクトが死んでいると判断するためのより主流の方法は、到達可能性分析です。生成されたすべてのオブジェクトは、「GCルート」と呼ばれるルートのサブツリーです。GCルートから始まり、下に向かって検索するパスは、参照チェーンと呼ばれます。オブジェクトが参照チェーンなしでGCルートに到達すると、オブジェクトは到達不能(参照不能)であると言われます。
  • 参照カウンターであろうと到達可能性分析であろうと、オブジェクトが生きているかどうかの判断は参照に関連しています!では、オブジェクトの参照をどのように定義するのでしょうか。
  • このような説明をしたいと思います。十分なメモリスペースがある場合は、メモリに格納できます。ガベージコレクション後もメモリスペースが非常に狭い場合は、これらのオブジェクトを破棄できます。したがって、さまざまなニーズに応じて、次の4つの参照が提供されます。参照のタイプに応じて、GCリカバリ中の操作は異なります。
  • 1)強力な参照:Object obj = new Object0;強力な参照がまだ存在する限り、GCは参照されたオブジェクトを再利用しません。
  • 2)ソフトリファレンス:説明-いくつかの有用なオブジェクトですが、必須ではありません。システムでメモリオーバーフローが発生する前に、これらのオブジェクトは2次リカバリのリカバリ範囲に含まれます(つまり、システムはリカバリされる前にメモリオーバーフローが発生します)。弱参照(弱参照)の程度はさらに悪くなります。ソフトリファレンスよりも弱くなります。これらのオブジェクトは、次のGCまでしか存続できません。GCが動作しているときは、メモリが十分であるかどうかに関係なくリサイクルされます(つまり、GCが実行されている限り、それらはリサイクルされます)。ファントム参照:オブジェクトにファントム参照があるかどうかは、構成されません。すべての影響でその寿命。メソッド領域でリサイクルする必要があるのは、いくつかの廃止された定数と役に立たないクラスです。
  • 1放棄された定数のリサイクル。ここで参照カウントを見てください。定数を参照するオブジェクトがない場合は、安全にリサイクルできます。
  • 2.役に立たないクラスのリサイクル。役に立たないクラスとは何ですか?
  • A.このクラスのすべてのインスタンスはリサイクルされています。つまり、Javaヒープにはこのクラスのインスタンスはありません。
  • B.クラスをロードしたClassLoaderがリサイクルされました。
  • C.このクラスに対応するjava.lang.Classオブジェクトはどこにも参照されておらず、このクラスのメソッドにはどこでもリフレクションを介してアクセスできません。
  • 概して:
  • ヒープ内のオブジェクトの場合、到達可能性分析は主に、オブジェクトにまだ参照があるかどうかを判断するために使用されます。オブジェクトに参照がない場合は、リサイクルする必要があります。n引用に対する実際のニーズに応じて、4つの引用に分けられ、各引用のリサイクルメカニズムも異なります。メソッド領域の定数とクラスの場合、定数にそれを参照するオブジェクトがない場合は、リサイクルできます。クラスの場合、
     

13.ネイティブjdbc操作データベースプロセスについて話しますか?

 

  1. 最初のステップ:Class.forName()はデータベース接続ドライバーをロードします。
  2. ステップ2:DriverManager.getConnection()はデータ接続オブジェクトを取得します。
  3. ステップ3:SQLに従ってSQLセッションオブジェクトを取得します。Statement.PreparedStatement;の2つの方法があります。
  4. 4番目のステップ:SQL処理結果セットを実行します。SQLを実行する前にパラメーター値がある場合は、パラメーター値setXXX0を設定します。
  5. 手順5:結果セットを閉じ、セッションを閉じて、接続を閉じます。
     

14. PreparedStatementは何を使用すればよいですか? 

 

  • 1. PreparedStatementインターフェイスはStatementを継承し、PreparedStatementインスタンスにはコンパイル済みSQLクエリが含まれているため、その実行速度はStatementオブジェクトよりも高速です。
  • 2. Statementのサブクラスとして、PreparedStatementはStatementのすべての機能を継承します。3つのメソッドexecute、executeQuery、executeUpdateが変更され、パラメーターが不要になりました。
  • 3. JDBCアプリケーションでは、次の理由から、Statementを使用しないでください。
  • 1.コードステートメントの可読性と保守性は継続的に接続する必要がありますが、PreparedStatementは接続しません。
  • 2. PreparedStatementパフォーマンスを可能な限り向上させます。DBにはキャッシュメカニズムがあり、同じプリペアドステートメントが再度呼び出された場合に再度コンパイルする必要はありません。
  • 第三に、最も重要な点はセキュリティを大幅に改善することです。ステートメントはSQLによって簡単に挿入でき、PreparedStatementcで渡されるコンテンツはSQLステートメントと一致する関係がありません。

15.リレーショナルデータベースの接続プールのメカニズムは何ですか?

  • 前提条件:データベース接続用のバッファープールを確立します。
  • 1:接続プールから使用可能な接続を取得または作成します
  • 2:使用後、接続を接続プールに戻します
  • 3:システムがシャットダウンする前に、すべての接続を切断し、接続によって占有されているシステムリソースを解放します
  • 4:無効な接続を処理し、接続プール内の接続の総数を特定の制限値以上または以下に制限する機能。
     

16.マップのキーと値をnullにすることはできますか?

 

  • HashMapオブジェクトのキーと値はnullにすることができます。
  • HahTableオブジェクトのkey。値をnullにすることはできません。
  • また、2つのキー値を繰り返すことはできません。同じキーでキーと値のペアを追加すると、次の値が前の値を自動的に上書きしますが、エラーは報告されません。
     

17. Javaの参照型は何ですか?(重要)

  • Javaのオブジェクト参照は、4つのレベルに分けられ、高から低までの4つのレベルは、強参照、ソフト参照、弱参照、およびファントム参照です。
  • 強力な参照(StrongReference)は、これについては言うまでもありませんが、強力な参照を使用して毎日コードを記述しています。オブジェクトが誰かによって強く参照されている場合、ガベージコレクターはオブジェクトを再利用しません。メモリスペースが不足している場合、Java仮想マシンはOutOfMemoryErrorエラーをスローしてプログラムを異常終了させ、強力な参照を持つオブジェクトを自由に再利用してメモリ不足の問題を解決しません。
  • Javaオブジェクトはヒープ内にあります。ヒープ内のオブジェクトには、到達可能性の高いオブジェクト、到達可能性の低いオブジェクト、到達可能性の低いオブジェクト、仮想到達可能オブジェクト、および到達不能オブジェクトが含まれます。適用の強さの順序は、強い、柔らかい、弱い、そして弱いです。オブジェクトがどの種類の到達可能なオブジェクトに属するかは、その最強の参照によって決定されます。次世代
     
  • 最初の行は、ヒープ内にコンテンツ「abc」を持つオブジェクトを作成し、abcからオブジェクトへの強力な参照を確立します。これは強力に到達可能です。
  • 2行目と3行目はそれぞれ、ヒープ内のオブジェクトへのソフト参照と弱い参照を確立します。現時点では、ヒープ内のabcオブジェクトへの参照はすでに3つあります。明らかに、現時点ではabcオブジェクトに強く到達できます。
  • 4行目以降、ヒープ内のオブジェクトは強く到達できなくなり、ソフト到達可能になります。
  • 5行目は、実行後にアクセスが弱くなります。ソフトリファレンス(SoftReference)
  • オブジェクトにソフト参照しかない場合、メモリスペースが十分であれば、ガベージコレクタはそれを再利用しません。メモリスペースが不十分な場合、これらのオブジェクトのメモリは再利用されます。ガベージコレクターがそれを再利用しない限り、オブジェクトはプログラムで使用できます。ソフト参照を使用して、メモリに依存するキャッシュを実装できます。
  • ソフト参照は、参照キュー(ReferenceQueue)と組み合わせて使用​​できます。ソフト参照によって参照されるオブジェクトがガベージコレクションされている場合、Java仮想マシンはそれに関連付けられた参照キューにソフト参照を追加します。ソフト参照は、主にメモリに依存するキャッシュに使用されます。jvmがメモリ不足を報告する前に、すべてのソフト参照がクリアされるため、gcはソフトアクセス可能なオブジェクトを収集し、メモリの問題を解決してメモリのオーバーフローを回避できます。いつ収集されるかは、gcアルゴリズムと、gcの実行時に使用可能なメモリのサイズによって異なります。
  • gcがソフト参照を収集することを決定したら、上記のsoftRefを例として、次のプロセスを実行します。
  • 1最初に、softRefの指示対象(abc)をnllに設定してから、ヒープ内の新しい文字列( "abc)オブジェクトを参照します。
  • 2ヒープ内の新しい文字列( "abc ')オブジェクトをファイナライズ可能に設定します。
  • 3ヒープ内の新しいString( "abc")オブジェクトのfinalize0メソッドが実行され、オブジェクトが占有していたメモリが解放されると、softRefがそのReferenceQueueに追加されます(存在する場合)。
  • 注:ReferenceQueueへのソフト参照と弱参照は省略できますが、ファントム参照が存在する必要があります。
  • ソフト参照が指すオブジェクトは、直接参照がなくてもクリアされません。JVMメモリが不足し、直接参照がなくなるまでクリアされません。SoftReferenceはオブジェクトキャッシュの設計に使用されます。このようにして、SoftReferenceはオブジェクトをキャッシュできるだけでなく、メモリ不足エラー(OutOfMemoryError)も発生しません。
  • 弱参照(WeakReference)
  • オブジェクトの参照が弱い場合、そのクラスは不要なオブジェクトです。これは、オブジェクトがgcによってスキャンされている限り、いつでも強制終了されるためです。弱参照とソフト参照の違いは、弱参照を持つオブジェクトのみのライフサイクルが短いことです。ガベージコレクタスレッドがその管轄下のメモリ領域をスキャンするプロセスでは、弱い参照のみを持つオブジェクトが見つかると、現在のメモリスペースが十分であるかどうかに関係なく、そのメモリが再利用されます。ガベージコレクターは(優先度が非常に低いスレッドであるため、常にそうであるとは限りません)、参照が弱いオブジェクトをすばやく見つけます。
  • 弱参照は、参照キュー(ReferenceQueue)と組み合わせて使用​​できます。弱参照によって使用されるオブジェクトが|参照を使用する|ガベージコレクションされている場合、Java仮想マシンはそれに関連付けられた参照キューに弱参照を追加します。
     
  • ファントムリファレンス
  • 名前が示すように、「仮想参照」は仮想参照に他なりません。他のタイプの参照とは異なり、仮想参照はオブジェクトのライフサイクルを決定しません。-オブジェクトがファントム参照のみを保持している場合、参照がない場合と同じです-いつでもガベージコレクションされる可能性があります。ファントム参照は、主にガベージコレクションされているオブジェクトのアクティビティを追跡するために使用されます。
  • ファントム参照とソフト参照および弱参照の違いの1つは、ファントム参照を参照キュー(ReferenceQueue)と組み合わせて使用​​する必要があることです。ガベージコレクターがオブジェクトを再利用する準備ができているときに、ファントム参照があることがわかった場合、オブジェクトのメモリを再利用する前に、関連する参照キューにファントム参照を追加します。プロセスは、仮想参照が参照キューに追加されているかどうかを判断することにより、参照されているオブジェクトがガベージコレクションされるかどうかを判断できます。
  • ファントム参照が参照キューに追加されていることをプログラムが検出した場合、参照されたオブジェクトのメモリが再利用される前に、プログラムは必要なアクションを実行できます。仮想参照が確立された後、getメソッドによって返される結果は常にnullです。ソースコードを介して、仮想参照が参照対象を参照先に書き込むことがわかりますが、getメソッドの戻り結果はnullです。gcと対話するプロセスを見てから、彼の役割について話しましょう。
  • 1指示対象をnullに設定せず、ヒープ内の新しい文字列( "abc ')オブジェクトをファイナライズ可能(ファイナライズ可能)に直接設定します。
  • 2ソフト参照や弱参照とは異なり、最初にPhantomRefrenceオブジェクトをそのReferenceQueueに追加し、次にファントム到達可能オブジェクトを解放します。
     

おすすめ

転載: blog.csdn.net/c202003/article/details/107396186