目次
6. スレッドセーフな HashMap が必要な場合はどうすればよいですか?
7. ConcurrentHashMap はスレッドの安全性をどのように保証しますか?
10. ArrayList のスレッドの安全性を確保するにはどうすればよいですか?
11. String、StringBuffer、StringBuilder の違い
1. インターフェースと抽象クラスの違い
類似性:
① インターフェースも抽象クラスもインスタンス化できない
② インターフェースを実装したり、抽象クラスを継承した通常のサブクラス
これらの抽象メソッドは実装する必要があります
違い:
① 抽象クラスには通常のメソッドとコードブロックを含めることができます。
インターフェイスには抽象メソッドと静的メソッドのみを含めることができます
そしてデフォルトの方法
② 抽象クラスにはコンストラクタを含めることができますが、インターフェースにはコンストラクタを含めることはできません。
③抽象クラスのメンバ変数は様々な型が可能
はい、インターフェイスのメンバー変数はパブリックのみにできます。
静的な最終 型であり、割り当てる必要があります
2. オーバーロードと書き換えの違い
①同一クラス、同一メソッド名でオーバーロードが発生し、
パラメータリスト、戻り値の型、権限修飾子は、
違う
②サブクラス、メソッド名、パラメータ列で書き換えが発生する
テーブルと戻り値の型は同じであり、許可修飾子はより大きくする必要があります。
親クラスのメソッドの場合、宣言された例外のスコープは親クラスのスコープより小さい
メソッド、ただし最終およびプライベートに変更されたメソッド
書き換え不可能
3. == と等しいの違い
① == 基本型の比較、値の比較、== 比較
参照型 と比較するとメモリアドレスが比較されます。
② equlas は Object クラスのメソッドであり、本質的には以下と同じです。
==、ただし一部のクラスは、equals メソッドをオーバーライドします。
Stringのequalsなどのメソッドが書き換えられる、
比較は文字値であり、equlas は書き換えられます。
その後、hashcode() メソッドもオーバーライドする必要があります。
4. 例外処理の仕組み
① try、catch、finally を使用して例外をキャッチします。
のコードが実行され、例外がキャッチされた後、プログラムは
実行し続ける
② throws を使用して、メソッドがスローする例外を宣言します。
定数型、例外発生後プログラムが終了する
5. ハッシュマップの原則
(1) ハッシュマップ
Jdk1.8以降は配列+リンクリスト+赤黒ツリーをベースに実装されています
さて、キーを繰り返すことができず、null にすることができるのが特徴です。
安全でないスレッド
(2) HashMap の拡張メカニズム:
HashMap のデフォルトの容量は 16 で、デフォルトの負荷率は
HashMap 内の要素の数が乗算された容量を超える場合、0.75 になります。
負荷係数の数が使用される場合、前の負荷係数のサイズが作成されます
新しい配列を 2 倍にして、元の配列のデータをコピーします
配列の長さが 64 に達し、リンクされたリストの長さに達すると、新しい配列に追加されます。
8 より大きい場合、リンクされたリストは赤黒のツリーに変わります。
(3) HashMap アクセス原則:
① キーのハッシュ値を計算し、2 回目のハッシュを実行します。
二次ハッシュ結果に従って、対応するインデックス位置を見つけます。
② この位置に値がある場合、最初に等価比較を実行し、
結果がtrueの場合は要素を置き換え、結果がfalseの場合は、
上位ビットと下位ビットの変換方法を使用して、リンクされたリストにノードを挿入する だけです(JDK 8)
従来はヘッド挿入方式を採用していましたが、ヘッド挿入方式も並行して拡張可能です
高翻訳および低翻訳中に、循環リンク リストやデータ損失が発生する可能性があります。
データの上書きが発生します)
6. スレッドセーフな HashMap が必要な場合はどうすればよいですか?
① ConcurrentHashMapを使用する
②ハッシュテーブルを利用する
③ Collections.synchronizedHashMap() 方法
7. ConcurrentHashMap はスレッドの安全性をどのように保証しますか?
JDK 1.7 : セグメント ロックを使用してマップを分割します
16 セグメント、各セグメントは小さなハッシュマップです。
各操作はセグメントの 1 つだけをロックします
JDK 1.8 : CAS+同期保証回線を採用
プログラムの安全性、データが挿入されるたびに、現在の配列に基づいて判断されます
マークを挿入するのが初めてかどうか。そうであれば、CAS を介して挿入します。
と入力し、f.hashが-1 に等しいかどうかを判断し、等しい場合は、
これは、他のスレッドが拡張されており、現在のスレッドも拡張されていることを意味します。
拡張に参加します。削除メソッドはsynchronizedで変更されます 。
並行して要素を削除する際の安全性を確保する
8. HashTable と HashMap の違い
① HashTable の各メソッドは同期を使用します
装飾なのでスレッドセーフですが、同時に読み取りと書き込みも効率的です
とても低い
② HashTable のKey をnullにすることはできません
③ HashTable はキーを 1 回だけハッシュします。
HashMapハッシュを2 回実行する
④ HashTable の下部に使用される配列とリンクされたリスト
9. ArrayList と LinkedList の違い
ArratList の基礎となる層は、デフォルトの容量が 1 である動的配列を使用します。
10. 要素数が容量に達したら、新しい要素を生成します
配列、サイズは前の配列の 1.5 倍になり、元の配列になります。
配列はメモリ内で接続されているため、配列をコピーします。
連続アドレスなので、ArrayList はデータをより速く。
拡張メカニズムによりデータの追加効率が低下する
LinkedList の最下層は、メモリ内で分離されたリンク リストを使用します。
分散しており、拡張メカニズムはありません。LinkedList はデータを探しています
データを最初からたどる必要があるため、検索は遅くなりますが、追加
データ効率の向上
10. ArrayList のスレッドの安全性を確保するにはどうすればよいですか?
① collentions.synchronizedList() メソッドを使用する
ArrayListをロックする
② Vector を使用します。Vector の最下層は Arraylist と同じです
同じですが、各メソッドは同期によって変更されます。
装飾品、非常に遅い
③ juc 配下の CopyOnWriterArrayList を使用し、
このクラスは、ロックなしで読み取り操作を実装し、書き込み操作は
list はコピーを作成し、その間に他のスレッドが読み取ります
どちらも元のリストであり、すべての書き込み操作はコピーで実行されます。
書き込みが完了したら、コピーした場所にポインタを置きます。
11. String、StringBuffer、StringBuilder の違い
① 文字列は char[] 配列で構成され、final を使用します
変更、文字列が変更されるたびに新しい文字列になります
String オブジェクトを生成し、ポインタを次のように指します。
新しい参照オブジェクト
② StringBuffer は可変でスレッドセーフです
③ StringBuiler は変数ですがスレッドセーフではありません
① 少量の文字データを操作するには String を使用します。
② 大量のデータをシングルスレッドで操作するには StringBuilder を使用します。
③大量のデータをマルチスレッドで操作するにはStringBufferを使用する
12.ハッシュコードと等しい
hashCode()とequals()は両方ともオブジェクトクラスです
メソッドのhashCode()はデフォルトでアドレスによって計算されます
ハッシュ コードですが、その内容を計算に使用するように書き換えられる可能性があります。
ハッシュコード、equals()はデフォルトでアドレスで2つを判断します
オブジェクトは等しいですが、コンテンツでオーバーライドされる可能性があります
2 つのオブジェクトを比較し、2 つのオブジェクトが等しい場合は、
hashCodeとequalsは等しい必要がありますが、
等しい hashCode を持つ 2 つのオブジェクトは必ずしも等しいとは限りません
equals() を書き換える場合は、 hashCode() を書き換える必要があります。
たとえば、HashMap でキーが String の場合、
Type、String なしでequals()のみを書き換える場合
hashcode() が書き換えられると、2 つの等しい ()
ハッシュコードが異なるために true と比較されるキー
その結果、2 つのキーがインデックスに表示されないため、
マップ内には 2 つの同一のキーが存在します。
13. オブジェクト指向とプロセス指向の違い
オブジェクト指向にはカプセル化、継承、ポリモーフィズムという特徴があるため、
プロセス指向と比較して、保守が容易、再利用が容易、拡張が容易、
ただし、クラスを呼び出すときにインスタンスを作成する必要があるため、オーバーヘッドが高くなります。
プロセス指向
4.ディープコピーとシャローコピー
浅いコピー: 浅いコピーはオブジェクトへの参照のみをコピーします。
オブジェクト自体はコピーされず、古いオブジェクトと新しいオブジェクトは同じブロックを共有したままになります。
メモリ
ディープコピー: ディープコピーは同一のオブジェクトを作成します。新しいオブジェクトは元のオブジェクトとメモリを共有せず、新しいオブジェクトを変更してもメモリは共有されません。
元のオブジェクトを変更します
15. ポリモーフィズムの役割
ポリモーフィズムの実装は継承され、書き換えられる必要があり、親クラスの参照は以下を指します。
サブクラスオブジェクト、その利点は型間のギャップを排除できることです
結合関係により、クラスのスケーラビリティと柔軟性が向上します。
16. 反省とは何ですか?
リフレクションは、 class のクラス オブジェクトを取得し、動的に取得することによって取得されます。
このクラスの内部構造を取得して動的に操作する
クラスのプロパティとメソッド
アプリケーションシナリオ:
不十分な権限でクラスのプロパティやメソッドを操作したい場合は、カスタムを実装してください。
アノテーションを定義するとき、サードパーティの jar パッケージを動的にロードし、追加するとき
クラスをロードし、コンパイルと初期化の時間を節約します。
クラス オブジェクトを取得するメソッドは次のとおりです。
①class.forName(クラスパス)
②クラス.クラス()
③オブジェクトのgetClass()
17. Java でオブジェクトを作成する 5 つの方法?
(1) 新しいキーワード
(2) Class.newInstance
(3) Constructor.newInstance
(4) クローン方式
(5) デシリアライズ