ThreadLocal (スレッド変数のコピー)
Synchronized はメモリ共有を実装し、ThreadLocal は各スレッドのローカル変数を維持します。
時間にスペースを使用することで、スレッド間のデータ分離に使用され、変数を使用する各スレッドにコピーが提供され、各スレッドは他のスレッドのコピーと競合することなく、独自のコピーを独立して変更できます。
ThreadLocal クラスは、各スレッドの変数のコピーを保存する Map を維持します。Map 内の要素のキーはスレッド オブジェクトであり、値は対応するスレッドの変数のコピーです。
ThreadLocal は Spring で大きな役割を果たしており、リクエスト スコープ内の Bean 管理、トランザクション管理、タスク スケジューリング、AOP などのモジュールに登場します。 Spring のほとんどの Bean はシングルトン スコープとして宣言でき、ThreadLocal を使用してカプセル化できるため、ステートフル Bean はマルチスレッドでシングルトン方式で正常に動作できます。
1. プログラムカウンター: 現在実行中のプログラムのメモリアドレスを保存するために使用されるデータ構造です。 Java 仮想マシンのマルチスレッドは、スレッドを順番に切り替えてプロセッサ時間を割り当てることで実現されます。スレッド切り替え後に正しい位置に戻るために、各スレッドは相互に影響を及ぼさない独立したプログラム カウンタを必要とします。スレッドは非公開です。」
2.Java 仮想マシン スタック: スレッド ライフ サイクルと同じプライベート スレッド。ローカル変数テーブル、操作スタック、メソッドの戻り値を保存するために使用されます。ローカル変数テーブルには、基本的なデータ型とオブジェクト参照が保持されます。
3. ネイティブ メソッド スタック: 仮想マシン スタックとよく似ていますが、仮想マシンで使用されるネイティブ メソッドを提供します。
4.Java ヒープ: すべてのスレッドによって共有されるメモリ領域。ほぼすべてのオブジェクト インスタンスがメモリを割り当てます。
5. メソッド領域: 各スレッドによって共有される領域で、仮想マシンによってロードされたクラス情報、定数、静的変数、およびコンパイルされたコードが格納されます。
6. 実行時定数プール: 実行時の各クラス ファイル内の定数テーブルを表します。コンパイル時の数値定数、メソッドまたはフィールド参照など、いくつかのタイプの定数が含まれます。
いつ:
1. 新しい世代には、Eden エリアと 2 つの Survivor エリアが存在します。不足している場合は、Eden エリアに入ります。それでも収まらない場合は、生き残ったオブジェクトを別の生存領域に移動し、Eden と以前のオブジェクトをクリアします。生存者エリアの。特定の GC プロセス中に、削除できないオブジェクトが見つかった場合、これらのオブジェクトは古い世代のメモリに置かれます。
2. 大きな物体や長期保存物が直接高齢者エリアに入ります。
3. マイナー GC が実行されるたびに、古い領域に移動しようとしている古いオブジェクトのサイズが古い領域の残りのサイズを超える場合は、それらのオブジェクトを分析する必要があります。可能な限り高齢者エリアのスペースを確保するためにフル GC が実行されます。
内容: GC ルートからオブジェクトを検索できず、マークのクリーンアップ後も復活したオブジェクトがありません。
やるべきこと: 若い世代: コピーのクリーニング; 古い世代: マークスイープおよびマーク圧縮アルゴリズム; 永続的な世代: Java とクラスをロードするクラスローダー自体にクラスを保存します。
GC ルートとは: 1. 仮想マシン スタックで参照されるオブジェクト 2. メソッド領域の静的プロパティによって参照されるオブジェクト、定数によって参照されるオブジェクト 3. ローカル メソッド スタック内の JNI (一般的にネイティブ メソッド) によって参照されるオブジェクト。
同期は悲観的ロック機構と排他的ロックです。 Locks.ReentrantLock は毎回ロックするわけではありませんが、競合がないと想定して操作を完了します。競合により失敗した場合は、成功するまで再試行します。 ReentrantLock に適用されるシナリオ
fail-fast: このメカニズムは Java の 1 つです。コレクション (Collection) エラー メカニズム。複数のスレッドが同じコレクションのコンテンツを操作すると、フェイルファスト イベントが発生する可能性があります。
例: スレッド A がイテレーターを介してコレクションを走査するときに、コレクションの内容が他のスレッドによって変更された場合、スレッド A がコレクションにアクセスすると、ConcurrentModificationException 例外がスローされ、フェイルファスト イベントが発生します。前に発生: 2 つの操作間に前に発生の関係がある場合、前の操作の結果が後の操作に表示されます。
1. プログラムシーケンスのルール: スレッド内の各操作は、スレッド内の後続の操作よりも前に発生します。
2. モニター ロックのルール: モニター ロックのロック解除は、その後のモニター ロックのロックより前に行われます。
3. 揮発性変数のルール: 揮発性フィールドへの書き込みは、その後のこの揮発性フィールドの読み取りより前に行われます。
4. 推移性: A が B より前に発生し、B が C より前に発生した場合、A は C より前に発生します。
5. スレッド起動ルール: Thread オブジェクトの start() メソッドは、このスレッドのすべてのアクションの前に発生します。
Volatile と Synchronized には 4 つの違いがあります:
1 粒度が異なり、前者は変数をターゲットにし、後者はオブジェクトとクラスをロックします
2 syn はブロックしますが、volatile スレッドはブロックしません
3 syn は 3 つの主要な機能を保証しますが、volatile は保証しませんatomicity
4 syn コンパイラの最適化、volatile には最適化されていません:
1. すべてのスレッドに対してこの変数の可視性を保証します。つまり、スレッドがこの変数の値を変更すると、新しい値が可視になります。他のスレッドにアクセスできますが、マルチスレッドセーフではありません。
2. 命令の並べ替えの最適化を無効にします。
Volatile がメモリの可視性を確保する方法:
1. volatile 変数を書き込むとき、JMM はスレッドに対応するローカル メモリ内の共有変数をメイン メモリに更新します。
2. 揮発性変数を読み取るとき、JMM はスレッドに対応するローカル メモリを無効にします。次にスレッドはメイン メモリから共有変数を読み取ります。
同期: 1 つのタスクの完了は別のタスクに依存します。依存タスクは、依存タスクが完了するのを待った後にのみ完了できます。
非同期: 依存タスクが完了するのを待つ必要はありません。依存タスクに完了する作業を通知するだけで済みます。独自のタスクが完了する限り、タスクは完了し、依存タスクに通知が返されます。完成しているかどうか。 (非同期の特徴は通知です)。 通話とテキストメッセージは、同期操作と非同期操作の比喩です。
ブロッキング: CPU は停止し、遅い操作が完了するまで待機してから、他の作業を完了します。
ノンブロッキング: ノンブロッキングとは、低速実行中に CPU が他の作業を実行し、低速実行が完了した後、後続の操作を完了することを意味します。
ノンブロッキングによりスレッドの切り替えが増加します。CPU 使用時間の増加がシステムの切り替えコストを補えるかどうかを考慮する必要があります。
CAS (比較および交換) ロックフリー アルゴリズム: CAS は、複数のスレッドが CAS を使用して同じ変数を同時に更新しようとすると、そのうちの 1 つのスレッドのみが変数の値を更新できます。 、他のスレッドは失敗します。スレッドは一時停止されませんが、競合が失敗したことが通知され、再試行できます。 CAS には、メモリ値 V、古い期待値 A、および変更される新しい値 B の 3 つのオペランドがあります。期待値 A とメモリ値 V が同じである場合に限り、メモリ値 V を B に変更します。そうでない場合は何も行いません。
スレッドプールの役割: プログラムが開始されると、処理に応答するために複数のスレッドが作成され、その内部のスレッドは作業スレッドと呼ばれます。
第一: リソースの消費を削減します。作成されたスレッドを再利用することで、スレッドの作成と破棄のコストを削減します。
2 番目: 応答速度を向上させます。タスクが到着すると、スレッドの作成を待たずにすぐにタスクを実行できます。
3 番目: スレッドの管理性を向上させます。
一般的に使用されるスレッド プール: ExecutorService は主要な実装クラスであり、その中で一般的に使用されるものは Executors.newSingleThreadPool()、newFixedThreadPool()、newcachedTheadPool()、newScheduledThreadPool() です。
クラスローダーの動作メカニズム:
1. ロード: Java バイナリコードを jvm にインポートし、クラスファイルを生成します。
2. 接続: a) 検証: ロードされたクラスファイルデータの正確性を確認します b) 準備: クラスの静的変数に記憶領域を割り当てます c) 解析: シンボル参照を直接参照に変換します
3: 初期化: クラス Static変数、静的メソッド、および静的コード ブロックは初期化作業を実行します。
親委任モデル: クラスローダーがクラスロードリクエストを受信すると、まずそのリクエストを親クラスローダーに委任して、ユーザー定義ローダー→アプリケーションローダー→拡張クラスローダー→クラスローダーの開始を完了します。
一貫したハッシュ:
Memcahed キャッシュ:
データ構造: キー、値のペア
使用メソッド: get、put およびその他のメソッド
Redis データ構造: String—文字列 (キーと値の型)
ハッシュ—辞書 (ハッシュマップ) ) Redis のハッシュ構造により、データベースの属性を更新するのと同じように、1 つの属性値のみを変更できます
List — リストはメッセージ キューを実装します
Set — セットは一意性を利用します
Sorted Set — 順序付きセットを並べ替えることができますデータの永続性を実現できます
Javaの自動ボックス化とアンボックス化の詳細な分析
Javaのリフレクションメカニズムについて話す
不変クラスの書き方は?
インデックス: B+、B-、フルテキスト インデックス
Mysql のインデックスは、データベースが効率的にデータを検索できるように設計されたデータ構造です。
一般的に使用されるデータ構造は B+Tree です。各リーフ ノードはインデックス キーの関連情報を格納するだけでなく、隣接するリーフ ノードへのポインタを追加します。これにより、シーケンシャル アクセス ポインタを持つ B+Tree が形成されます。さまざまな間隔でのアクセスのパフォーマンスを向上させます。
インデックスを使用する場合:
group by、order by、および個別のキーワードの後によく現れるフィールド
他のテーブルに頻繁に接続されるテーブルは、接続されたフィールドにインデックスを作成する必要があります
頻繁に使用されるフィールドWhere 句に出現します
多くの場合、クエリ選択に使用されるフィールドとして出現します
Spring IOC (制御の反転、依存性注入)
Spring は、属性 (Setter メソッド) インジェクション、コンストラクター インジェクション、およびインターフェースインジェクション。
Spring では、アプリケーションを構成し、Spring IOC コンテナーによって管理されるオブジェクトは Bean と呼ばれます。
Spring の IOC コンテナは Bean をインスタンス化し、リフレクション メカニズムを通じて Bean 間の依存関係を確立します。
簡単に言うと、Bean は Spring IOC コンテナによって初期化、組み立て、管理されるオブジェクトです。
Bean オブジェクトを取得するプロセスは、まず Resource を通じて設定ファイルをロードし、IOC コンテナを起動し、次に getBean メソッドを通じて Bean オブジェクトを取得し、そのメソッドを呼び出します。
Spring Bean スコープ:
Singleton: Spring IOC コンテナーには共有 Bean インスタンスが 1 つだけあり、通常は Singleton スコープです。
プロトタイプ: 各リクエストは新しい Bean インスタンスを生成します。
リクエスト: 各 http リクエストは新しい Bean インスタンスを生成します。
エージェントの共通の利点: ビジネス クラスはビジネス ロジック自体にのみ焦点を当てる必要があり、ビジネス クラスの再利用性が保証されます。
Java 静的プロキシ:
プロキシ オブジェクトとターゲット オブジェクトは同じインターフェイスを実装します。ターゲット オブジェクトは、特定のインターフェイス実装では、対応するインターフェイスの呼び出しの前後に他のビジネス処理ロジックを追加できます。対象オブジェクトのメソッド。
欠点: 1 つのプロキシ クラスは 1 つのビジネス クラスしかプロキシできません。ビジネス クラスがメソッドを追加する場合、対応するプロキシ クラスもメソッドを追加する必要があります。
Java 動的プロキシ:
Java 動的プロキシは、InvocationHandler インターフェイスを実装し、Invoke メソッドをオーバーライドするクラスを作成します。このパブリック プロキシ クラスは、プロキシするオブジェクトのみを明確にすることができます。実行中に同時にプロキシされたクラスのメソッドを実装でき、クラス メソッドの実装時に拡張を実行できます。
実際: プロキシ オブジェクトのメソッド = 拡張処理 + プロキシ オブジェクトのメソッド
動的プロキシ クラスを生成する JDK と CGLIB の違い:
JDK 動的プロキシは、インターフェイスを実装するクラスのプロキシを生成 (クラスのインスタンス化) することしかできません。このとき、プロキシ オブジェクトとターゲット オブジェクトは同じインターフェイスを実装し、ターゲット オブジェクトはプロキシ オブジェクトの属性として使用され、対応するメソッドの呼び出しの前後に他の業務処理ロジックを追加できます。 CGLIB は、クラスのプロキシを実装します。主に、指定されたクラスのサブクラスを (クラスをインスタンス化せずに) 生成し、その中のメソッドをオーバーライドします。
Spring AOP アプリケーション シナリオ
パフォーマンス テスト、アクセス制御、ログ管理、トランザクションなど
デフォルトの戦略は、ターゲット クラスがインターフェイスを実装する場合、JDK 動的プロキシ テクノロジを使用することです。ターゲット オブジェクトがインターフェイスを実装しない場合、CGLIB プロキシがデフォルトで使用されます
DNS ドメイン名解決 –> TCP スリーウェイ ハンドシェイクを開始 –> サーバーは http リクエストに応答し、ブラウザは HTML コードを取得します。 HTML コードを解析し、HTML コード リソース (JavaScript、CSS、画像など) を要求します –> ブラウザはページをレンダリングしてユーザーに表示します
セッションと Cookie: Cookie を使用すると、サーバーは各クライアントの訪問を追跡できますが、これらの Cookie はクライアントの訪問ごとに返される必要があります。Cookie が多い場合、クライアントとサーバー間のデータ送信量が目に見えないほど増加します。 Session はこの問題を非常にうまく解決します。同じクライアントがサーバーと対話するたびに、毎回すべての Cookie 値を返す必要はなく、毎回 ID を返します。クライアントはサーバーによって生成された一意の ID にアクセスします。クライアントはこの ID を返すだけで済みます。通常、この ID は JSESSIONID という名前の Cookie です。このようにして、サーバーはこの ID を使用して、サーバーに保存されている KV 値を取得できます。
セッションとCookieのタイムアウトの問題、Cookieのセキュリティの問題
デコレーターモード: オリジナルのインターフェースを維持し、オリジナルの機能を強化します。
FileInputStream は、InputStream のすべてのインターフェイスを実装します。BufferedInputStreams は FileInputStream を継承し、読み取りパフォーマンスを向上させるために、InputStream によって読み取られたコンテンツをメモリに保存する特定のデコレータ実装者です。
1. トランザクションの側面を実装するビジネス クラス メソッドを見つけるために使用されるポイントカット情報
2. トランザクションの動作を制御するトランザクション属性。これらの属性には、トランザクション分離レベル、トランザクション伝播動作、タイムアウト期間、ロールバック ルールが含まれます。
すべての Mybatis アプリケーションは、SqlSessionFactory オブジェクトのインスタンスを中心としています。まず、バイト ストリームを使用して Resource を通じて構成ファイルを読み取り、次に SqlSessionFactoryBuilder().build メソッドを通じて SqlSessionFactory を作成し、次に SqlSessionFactory.openSession() メソッドを通じて各データベース トランザクションを提供する SqlSession を作成します。
Mybatis の初期化 –> SqlSession の作成 –> SQL ステートメントを実行して結果を返す 3 つのプロセスを実行します
プロセス全体は次のとおりです: フィルターはユーザー リクエストを前処理し、リクエストをサーブレットに渡します応答を処理して生成し、最後にフィルターによってサーバー応答を後処理します。
Filter は、特定の URL リクエストと応答を前処理および後処理できます。
HttpServletRequest がサーブレットに到達する前に、クライアントの HttpServletRequest をインターセプトします。
必要に応じて HttpServletRequest を確認し、HttpServletRequest ヘッダーとデータを変更することもできます。
HttpServletResponse がクライアントに到達する前にインターセプトします。
必要に応じて HttpServletResponse を確認し、HttpServletResponse ヘッダーとデータを変更することもできます。
1. Web サーバーの起動時にフィルターが初期化されます
2. サーブレットが 1 で設定されている場合、Tomcat (サーブレット コンテナー) の起動時にサーブレットも初期化されます。
3. サーブレットが設定されていない場合 1、Tomcat の起動時にサーブレットは初期化されませんが、リクエストが来たときに初期化されます。
4. リクエストが行われるたびにリクエストは初期化され、リクエストに応答した後、リクエストは破棄されます。
5.サーブレットが初期化された後、リクエストが終了してもログアウトされません。
6. Tomcat を閉じると、サーブレットとフィルターが順番にログアウトされます。
1. HashMap はスレッドセーフではありませんが、HashTable はスレッドセーフです。
2. HashMap のキーと値はどちらも null 値を許可しますが、HashTable は許可しません。
3. スレッドの安全性の問題により、HashMap は HashTable よりも効率的です。
ConcurrentHashMap は、ロック セグメンテーション テクノロジを使用して、スレッドの安全性を確保します。ロック セグメンテーション テクノロジ: まず、データをストレージ用のセグメントに分割し、次に、スレッドがロックのいずれかにアクセスするときにデータの各セグメントにロックを割り当てます。データ、他のセグメントのデータには他のスレッドからもアクセスできます
ConcurrentHashMap は各セグメントでスレッドセーフです
LinkedHashMap は二重リンクリストを維持し、その中のデータは書き込むことができます シーケンシャル読み取り
ConcurrentHashMap アプリケーション シナリオ
1: ConcurrentHashMap のアプリケーション シナリオは高い同時実行性を備えていますが、同期された HashMap と HashMap はコンテナー全体をロックします。コンテナー全体をホストするには、ConcurrentHashMap をロックする必要はありません。対応するセグメントをロックするだけでよいため、高い同時同期アクセスが保証され、効率が向上します。
2: 複数のスレッドで書き込むことができます。
ConcurrentHashMap は、HashMap を複数のセグメントに分割します
1. 取得時に、最初にセグメントを見つけてから、読み取り操作のヘッド ノードを見つけます。値は揮発性変数であるため、競合状態が発生した場合でも最新の値を読み取ることが保証されます。読み取られた値が null の場合は変更されている可能性があり、ReadValueUnderLock 関数が呼び出され、ロックが適用されます。読み取られたデータは正しいです。
2.置くとロックされてハッシュチェーンの先頭に追加されます。
3. 削除するときもロックされます。次は最終的なタイプであり、変更できないため、削除されたノードより前のすべてのノードをコピーする必要があります。
4.ConcurrentHashMap では、複数の変更操作を同時に実行できます。その鍵は、ロック分離テクノロジーの使用にあります。複数のロックを使用して、ハッシュ テーブルのさまざまなセグメントへの変更を制御します。
ConcurrentHashMap のアプリケーション シナリオは高い同時実行性を備えていますが、同期された HashMap と HashTable は、ロック後にコンテナ全体をロックする必要はなく、対応するセグメントをロックするだけで済みます。これで、高い同時同期アクセスを確保し、効率を向上させることができます。
ConcurrentHashMap は、各呼び出しがアトミック操作であることを保証できますが、複数の呼び出しもアトミック操作であることは保証されません。
VectorとArrayListの違い
ExecutorService service = Executors.... ExecutorService service = new ThreadPoolExecutor() ExecutorService service = new ScheduledThreadPoolExecutor();
ThreadPoolExecutorのソースコード解析
スレッドプール自体のステータス:
待機中のタスクキューとワーキングセット:
スレッドプールのメインステートロック:
スレッドプールの生存時間とサイズ:
1.2 ThreadPoolExecu の内部動作原理トール
と上記の定義データが内部でどのように実装されているかを見てみましょう。 Doug Lea のアイデア全体は 5 つの文に要約されています:
現在のプール サイズ poolSize が corePoolSize より小さい場合は、タスクを実行する新しいスレッドを作成します。
現在のプールサイズpoolSizeがcorePoolSizeより大きく、待機キューがいっぱいでない場合、待機キューに入ります
現在のプールサイズpoolSizeがcorePoolSizeより大きく、maximumPoolSizeより小さい場合、待機キューに入りますがいっぱいの場合は、タスクを実行するための新しいスレッドを作成します。
現在のプール サイズ poolSize が corePoolSize より大きく、maximumPoolSize より大きく、待機キューがいっぱいの場合、タスクを処理するために拒否ポリシーが呼び出されます。
スレッド プール内の各スレッドは、タスクの実行後すぐには終了しません。代わりに、keepAliveTime 内に新しいタスクを待機できない場合、実行する必要のあるスレッド タスクがあるかどうかを確認します。 、スレッドは終了します。
Executor パッケージ構造
CopyOnWriteArrayList: 要素を追加するときに、元のコンテナをコピーし、新しいコンテナにコピーしてから、新しいコンテナに追加します。コンテナに書き込み、書き込み後に元のコンテナの参照を新しいコンテナにポイントします。読み取り時には古いコンテナのデータが読み取られるため、同時読み取りを実行できますが、これは弱い整合性戦略です。
使用シナリオ: CopyOnWriteArrayList は、キャッシュなど、読み取り操作が書き込み操作よりもはるかに大きいシナリオでの使用に適しています。
一般的な Linux コマンド: cd、cp、mv、rm、ps (プロセス)、tar、cat (コンテンツの表示)、chmod、vim、find、ls
デッドロックの必要条件
mutual exclusionには、非共有状態の少なくとも1つのリソースがあり、待機中のリソースは、デッドロックを解決するために待っています。最初のものはデッドロックです上記4つの条件を同時に満たすようにする。 2 つ目は、リソースを合理的に割り当てることです。プロセス間通信方式
Pipe (パイプ): パイプは、データが一方向にのみ流れることができ、関連するプロセス間でのみ使用できます。プロセス アフィニティは通常、親子プロセス関係を指します。
名前付きパイプ: 名前付きパイプも半二重通信方法ですが、無関係なプロセス間の通信が可能になります。
セマフォ: セマフォは、複数のプロセスによる共有リソースへのアクセスを制御するために使用できるカウンターです。これは、プロセスがリソースにアクセスしているときに、他のプロセスが共有リソースにアクセスできないようにするロック メカニズムとしてよく使用されます。したがって、主にプロセス間、および同じプロセス内の異なるスレッド間の同期手段として使用されます。
メッセージ キュー (メッセージ キュー): メッセージ キューは、カーネルに格納され、メッセージ キュー識別子によって識別されるメッセージのリンクされたリストです。メッセージ キューは、信号送信情報が少なく、パイプはフォーマットされていないバイト ストリームのみを伝送でき、バッファ サイズが制限されているという欠点を克服します。
MYSQL 最適化の一般的な方法
MySQL ストレージ エンジン - MyISAM と InnoDB の違いHibernate の 1 次キャッシュはセッションによって提供されるため、セッションのライフサイクルで、プログラムが save()、update()、saveOrUpdate() などのメソッドを呼び出し、クエリ インターフェイスのリスト、フィルター、反復を呼び出すときに、対応するオブジェクトがセッション キャッシュに存在しない場合、 Hibernate は 1 次キャッシュに追加されますが、セッションが閉じられるとキャッシュは消えます。
Hibernate 2 次キャッシュ: 取得したすべてのデータ オブジェクトを ID に従って 2 次キャッシュに置きます。 Hibernate の 2 番目のキャッシュ戦略は、ID クエリのキャッシュ戦略であり、データが削除、更新、または追加されると、同時にキャッシュが更新されます。
プロセスとスレッドの違い:
プロセス: 各プロセスには独立したコードとデータ領域 (プロセス コンテキスト) があり、プロセス間の切り替えには大きなオーバーヘッドが発生します。
スレッド: 同じタイプのスレッドはコードとデータ空間を共有し、各スレッドは独立した実行スタックとプログラム カウンター (PC) を持ち、スレッド切り替えのオーバーヘッドは小さくなります。
スレッドとプロセスは、作成、準備完了、実行、ブロック、終了の 5 つの段階に分かれています。 マルチプロセスとは、オペレーティングシステムが複数のタスク(プログラム)を同時に実行できることを意味します。
マルチスレッドとは、同じプログラム内で複数のシーケンス フローを実行することを指します。
Java でマルチスレッドを実現するには、Thread クラスを継続する方法、もう 1 つは Runable インターフェースを実装する方法、そして 3 つ目は Callable インターフェースを実装する方法があります。
Switchはパラメータとして文字列を使用できますか?
a. Java 7 より前では、switch は byte、short、char、int、またはそれらに対応するカプセル化クラスと Enum 型のみをサポートしていました。 Java 7 では、文字列のサポートが追加されました。
Object のパブリック メソッドとは何ですか?
a. メソッド equals は、2 つのオブジェクトが等しいかどうかをテストします
b. メソッド clone は、現在のオブジェクト
に関連する Class オブジェクトを返します
メソッドは、notify、notifyall、およびwait はすべて、指定されたオブジェクトに対してスレッド同期を実行するために使用されます
Java の 4 つのリファレンス、その長所と短所、およびそれらが使用されるシナリオ
a. OOM 問題を解決するには、ソフト参照と弱参照を使用します。メモリが不足している場合、HashMap を使用して、画像のパスと、対応する画像オブジェクトに関連付けられたソフト参照の間のマッピング関係を保存します。これらのキャッシュされた画像オブジェクトのスペースを再利用することで、OOM の問題を効果的に回避できます。
b. ソフトアクセス可能なオブジェクト取得メソッドを使用して Java オブジェクトのキャッシュを実装します。たとえば、従業員の情報を毎回クエリする必要がある場合に、Employee クラスを作成する場合です。たとえほんの数秒前にクエリされたとしても、インスタンスを再構築する必要があり、これには多くの時間がかかります。ソフト参照と HashMap を組み合わせることができます。まず、参照を保存します。従業員オブジェクトのインスタンスをソフト参照の形式で参照し、その参照を HashMap に保存します。キーは従業員の ID で、値はそのソフト参照です。一方、このオブジェクトは、参照を取り出して、キャッシュ内に Employee インスタンスへのソフト参照があるかどうかを確認し、存在する場合はソフト参照から取得します。ソフト参照がない場合、またはソフト参照から取得したインスタンスが null の場合は、インスタンスを再構築し、ソフト参照を新しく作成したインスタンスに保存します。
c. 強参照: オブジェクトに強参照がある場合、そのオブジェクトはガベージ コレクターによってリサイクルされません。現在のメモリ空間が不十分な場合でも、JVM はメモリ空間を再利用せず、OutOfMemoryError エラーをスローし、プログラムが異常終了します。強参照とオブジェクト間の関連付けを解除したい場合は、JVM が適切なタイミングでオブジェクトをリサイクルできるように、参照を明示的に null に割り当てることができます。
d. ソフト参照: ソフト参照を使用する場合、メモリ容量が十分であれば、ソフト参照はガベージ コレクターによって再利用されずに使用し続けることができます。リサイクルします。
e. 弱い参照: 弱い参照を持つオブジェクトのライフサイクルは短くなります。これは、JVM がガベージ コレクションを実行するときに、弱参照オブジェクトが見つかると、現在のメモリ領域が十分であるかどうかに関係なく、その弱参照がリサイクルされるためです。ただし、ガベージ コレクターは優先度の低いスレッドであるため、弱い参照オブジェクトをすぐに見つけることができない場合があります。
f. 仮想参照: 名前が示すように、オブジェクトが仮想参照のみを保持している場合、それは参照を持たないことと同等であり、いつでもガベージ コレクターによってリサイクルされる可能性があります。
ハッシュコードとイコールの違いは何ですか?
a. Java コレクションには list と set の 2 種類があり、このメソッドは要素の繰り返し実装を許可しません。要素が 1,000 個ある場合は、equal を使用して比較します。要素が同じかどうかを確認するには、equal を 1,000 回呼び出す必要があります。これにより、効率が大幅に低下します。ハッシュコードは実際にはオブジェクトの格納アドレスを返します。この位置に要素が存在しない場合、その要素はそのすぐ上に格納されます。この時点で、equal メソッドが呼び出され、新しいものと比較されます。要素が同じである場合、別のアドレスに保存してハッシュすることはできません。
オーバーライドとオーバーロードの意味と違い
a. オーバーロードは、名前が示すように、クラスの多態性を表現できますが、パラメーター名は同じである可能性があります。 、戻り値、および型を同じにすることはできません。つまり、パラメーター、型、および戻り値は変更できますが、関数名は変更されません。
b. サブクラスが親クラスを継承する場合、サブクラスがこの関数を呼び出すと、そのサブクラスが自動的に呼び出されます。そして親クラスはオーバーライドされる(オーバーライドされる)ことと同じです。
詳細については、C++ でのオーバーロードと書き換え (上書き) の違いの分析例を参照してください。
抽象クラスとインターフェイスの違い
a クラスは 1 つのクラスのみを継承できますが、実装することはできます。複数のインターフェース
b. 抽象クラスはコンストラクターを持つことができますが、インターフェースはコンストラクターを持つことができません
c. 抽象クラスの一部の基本メソッドを抽象クラスに実装することを選択できます。インターフェースでは、すべてのメソッドが抽象である必要があります
。抽象クラスには静的メソッドを含めることができますが、インターフェースには通常のメンバー変数を含めることはできません
XML の解析方法それぞれの原理と特性メソッド: DOM、SAX、PULL
a.DOM: メモリ消費: まず XML ドキュメントをメモリに読み込み、次に DOM API を使用してツリー構造にアクセスし、データを取得します。これは非常に簡単に記述できますが、大量のメモリを消費します。データが大きすぎて携帯電話の性能が十分でない場合、携帯電話が直接クラッシュする可能性があります
b.SAX: 高い解析効率、少ないメモリ使用量、イベント駆動型: より簡単に言うと、文書をスキャンするときに文書を順次スキャンします。スキャン)、要素の始まりと終わり、文書の終わりなどがイベント処理関数に通知され、イベント処理関数は対応するアクションを実行し、文書の終わりまで同じスキャンを続けます。
c.PULL: SAX と同様に、イベント駆動型でもあり、次の解析イベント (つまり、開始ドキュメント、終了ドキュメント、開始タグ、終了タグ) を取得するために next() メソッドを呼び出すことができます。特定の要素で XmlPullParser の getAttributte() メソッドを呼び出して属性の値を取得するか、その nextText() を呼び出してこのノードの値を取得できます。
wait() と sleep() の違いは
sleep は Thread クラスに由来し、wait は Object クラスに由来します
sleep() メソッドの呼び出し中、スレッドはオブジェクトのロックを解放しません。 wait メソッドを呼び出すスレッドはオブジェクトのロックを解放します
sleep はスリープ後にシステム リソースを放棄しませんが、他のスレッドが CPU を占有する可能性があります
スリープ時間 (ミリ秒) を指定する必要があります。時間になると自動的に起動します
JAVA ヒープとスタックの違い、Java のメモリメカニズムについて話しましょう
a. 基本的なデータ型、変数、オブジェクト参照はすべてスタックに割り当てられます
b。 new
によって作成されたオブジェクトと配列を保存するために使用されます c. クラス変数(静的によって変更された変数)、プログラムはロードされるとすぐにヒープ内のクラス変数にメモリを割り当て、ヒープ内のメモリアドレスが保存されますスタック
d 内のインスタンス変数: Java キーワード new を使用すると、システムが必ずしも連続的ではないヒープ内の領域を解放し、それを変数に割り当てるとき、それは分散ヒープ メモリ アドレスに基づいて変換されます。ハッシュ アルゴリズムを使用して、ヒープ内の変数の「物理的位置」を表す一連の数値 – インスタンス変数への参照が失われると、そのインスタンス変数は再利用可能な「リスト」に含まれます。 GC (ガベージ コレクター) ですが、ヒープ内のメモリはすぐには解放されません
e. ローカル変数: 特定のメソッドまたは特定のコード セグメント (for ループなど) で実行されるときに、メモリはスタック上に割り当てられます。ローカル変数がスコープ外になると、メモリはすぐに解放されます
JAVA ポリモーフィズムの実装原理
a送信者によって動作が異なります。 (メッセージの送信は関数呼び出しです)
b. 実装原理は動的バインディングであり、プログラムによって呼び出されるメソッドは実行時に動的にバインドされます。パラメーター。
関連する推奨事項:
Java のクラスのロード順序の分析 (面接の質問でよく使用されます)
以上が大手企業のJava面接質問まとめ(全て)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。