1. equalsメソッドは、オブジェクトのコンテンツが等しいかどうかを比較するために使用されます(後でオーバーライドされます)
2。ハッシュコード法は、コレクションでのみ使用されます
3。等方メソッドが上書きされた場合、比較オブジェクトが等しいかどうかは、上書きの等式法を介して比較されます(オブジェクトの内容が等しいかどうかを判断します)。
4.オブジェクトをコレクションに入れるとき、最初に配置するオブジェクトのハッシュコード値がコレクション内の任意の要素のハッシュコード値に等しいかどうかを決定します。等しくない場合は、オブジェクトをコレクションに直接入れます。ハッシュコード値が等しい場合、等しい方法を使用して、配置するオブジェクトがコレクション内の任意のオブジェクトに等しいかどうかを決定します。等しい判断が平等でない場合は、要素をコレクションに直接入れます。そうしないと、配置されません。
5. equalsメソッドは、オブジェクトメモリアドレスが等しいかどうかを使用して、オブジェクトが等しいかどうかを決定します。
それらは2つの新しいオブジェクトであるため、オブジェクトのメモリアドレスは等しくないため、Stu1.equals(Stu2)は偽です。
6。スレッドAとBは両方ともオブジェクトOのロックを取得する必要があります。AがオブジェクトOのロックを取得すると仮定すると、BはAがOのロックを解放するのを待ちます。S同期が使用された場合、Aが解放されない場合、Bは継続するのを待ち、中断できません。 ReentrantLockが使用されている場合、Aがリリースされない場合、Bは十分な時間を待っていて、他のことを行うことができます。
ReentrantLockは3つの方法でロックを取得します。
a)lock()、ロックが取得された場合、すぐに戻ります。別のスレッドがロックを保持している場合、現在のスレッドはロックが取得されるまで休眠状態のままになります。
b)tryLock()、ロックが取得された場合、すぐにtrueを返し、別のスレッドがロックを保持している場合、すぐにFALSEを返します。
c)トリロック(ロングタイムアウト、タイムニットユニット)、ロックが取得された場合、すぐにtrueを返します。別のスレッドがロックを保持している場合、パラメーターの指定された時間を待ちます。
待機プロセス中に、ロックが取得された場合、それは真実に戻り、待機時のタイムアウトの場合、falseが返されます。
d)砕石可能:ロックが取得された場合は、すぐに戻ります。ロックが取得されない場合、現在のスレッドは、またはロックされるまで休眠状態になります。
または、現在のスレッドが別のスレッドによって中断されます
同期はJVMレベルで実装されます。いくつかの監視ツールを介して同期ロックを監視できるだけでなく、コード実行中に例外も発生する可能性があります。
JVMはロックを自動的に放出しますが、ロックを使用することはできません。ロックはコードを介して実装されます。ロックがリリースされることを確認するには、Unlock()を最終的に{}に配置する必要があります
リソースの競争がそれほど激しくない場合、同期のパフォーマンスはReetrantLockのパフォーマンスよりも優れています。ただし、リソース競争が非常に激しい場合、同期のパフォーマンスは何十回も減少しますが、ReetrantLockのパフォーマンスは正常なままである可能性があります。
JDKでは、次のクラスが主にJava反射メカニズムを実装するために使用されます。これはすべてjava.lang.refllectパッケージにあります。
クラス:クラスを表します。
フィールドクラス:クラスを表すメンバー変数(メンバー変数はクラスの属性とも呼ばれます)。
メソッドクラス:クラスを表すメソッド。
コンストラクタークラス:クラスのコンストラクターメソッドを表します。
配列クラス:アレイを動的に作成し、アレイの要素にアクセスするための静的な方法を提供します。
反射APIの実際のアプリケーションを見るためのいくつかの例を以下に示します。
1.クラスクラスを通じて、メンバー変数、メンバーメソッド、インターフェイス、スーパークラス、コンストラクターメソッドなどを取得します
getClass()メソッドはjava.lang.objectクラスで定義されているため、任意のJavaオブジェクトでは、このメソッドを使用してオブジェクトタイプを取得できます。クラスクラスは反射APIのコアクラスであり、次の方法があります
getName():クラスのフルネームを取得します。
getFields():クラスの公開タイプの財産を取得します。
getDeclaredFields():クラスのすべてのプロパティを取得します。
getMethods():クラスの公開タイプを取得する方法。
getDeclaredMethods():クラスのすべての方法を取得します。
getMethod(string name、class [] parametertypes):クラスの特定のメソッドを取得し、名前パラメーターメソッドの名前を指定し、パラメータ型パラメーターはメソッドのパラメータータイプを指定します。
getConstructors():クラスのパブリックタイプのコンストラクターを取得します。
getConstructor(class [] parametertypes):クラスの特定のコンストラクターを取得します。パラメータ型パラメーターは、コンストラクターのパラメータータイプを指定します。
newInstance():パラメーターなしでクラスのコンストラクターを介してこのクラスのオブジェクトを作成します。
Javaリフレクターを書く手順:
1)最初にクラスのクラスオブジェクトを取得する必要があります
例えば:
クラスC1 = test.class; class c2 = class.forname( "com.reflection.test");クラスc3 = new test()。getClass();
2)次に、クラスオブジェクトのメソッドを個別に呼び出して、クラスのプロパティ/メソッド/コンストラクターを取得します
注:通常、クラスでメソッド/プロパティ/コンストラクターを取得する場合は、次のリフレクションクラスに焦点を当てる必要があります
分野
コンストラクタ
方法
<サーブレットマッピング> <Servlet-name> </servlet-name> <url-pattern> </url-pattern> </servlet-mapping> for(string letenta:str){system.out.print(elementa + ""); } list <string> list = new ArrayList <String>(); for(int i = 0; i <str.length; i ++){if(!list.contains(str [i])){list.add(str [i]); }} set <string> set = new Hashset <String>(); for(int i = 0; i <str.length; i ++){set.add(str [i]); }Springには6つのトランザクションと5つの分離レベルがあります
カテゴリー1:inte short int long
カテゴリ2:フロートダブル
3番目のカテゴリ:論理ブール(True Falseと見なされる2つの値のみがあります)
カテゴリ4:キャラクターチャージ
最終的な変更クラスの方法
機能:継承することはできますが、継承後に書き直すことはできません。
最終的な変更クラス
関数:クラスを継承することはできません。
基本タイプを最終的に変更する場合、値は変更されません。参照型は、アドレスが変更されていないままであることを示します。つまり、新しい場合、アドレスを再割り当てすることはできません。
最終的な変更属性を知っています
準備が事前に拡張されます。最初に、前処理のためにSQLをデータベースに送信してから、キャッシュに入れます。次回同じものがあることがわかったときは、コンパイルする必要はありません。実行効率が高く、チェックを容易にするための構文プロンプトがあり、パラメーターは動的であり、構文チェックのためにSQLインジェクションを防止します
select * from tbname = 'zck'およびpasswd = 'または' 1 '=' 1 ';
ステートメントは事前補償されておらず、構文エラーを手動でチェックする必要があります。これはハードコードされています
Hashmapはエントリのキーまたは値としてnullを許可しますが、ハッシュテーブルは
PUTメソッド
HashMapは、null値キーで特別な処理を実行し、常にテーブル[0]位置に配置します。プロセスは、最初にハッシュを計算し、次にハッシュとテーブルの長さを介してインデックス値を計算し、次にキーをテーブル[インデックス]位置に置きます。表[インデックス]に他の要素が既に存在する場合、リンクリストがテーブル[インデックス]位置に形成され、新しく追加された要素がテーブル[インデックス]に配置され、元の要素は次のエントリを通じてリンクされます。このようにして、ハッシュ競合の問題はリンクされたリストの形で解決されます。要素の数が臨界値(capactiy*factor)に達すると、容量が拡張され、テーブル配列の長さがtable.length*2になります。
メソッドを取得します
同様に、キーがnullである場合、特別な処理が実行され、キーを持つ要素がnullがテーブル[0]のリンクリストに記載されています。
GETのプロセスは、最初にハッシュを計算し、次にハッシュとテーブルの長さを介してインデックス値を計算し、キーが見つかるまでテーブル[インデックス]のリンクリストを繰り返し、次にハッシュマップとハッシュテーブルの基礎となる実装を返し、最初にハッシュを計算するためにアレイ +リンクリスト構造の実装です。テーブル配列の添え字であるインデックスは、ハッシュとテーブルの長さに基づいて計算され、計算され、対応する操作が実行されます。
ほとんどのインデックスは、Bツリーに基づいています
サーブレットスレッドの安全性の問題は、主にインスタンス変数によって引き起こされるため、インスタンス変数をサーブレットで避ける必要があります。
アプリケーション設計がインスタンス変数の使用を避けられない場合、同期は使用されるインスタンス変数を保護するために使用されますが、最適なシステムパフォーマンスのために、最小限の可用性のあるコードパスを同期する必要があります。
シングルトンパターンを書きます
public static long recursive(int n){if(n <= 0)return 0; if(n == 1)return 1; returs recursive(n -1) +再帰(n -2);} public static long loop(int n){if(n <= 0)return 0; if(n == 1)return 1; long fib1 = 0; long fib2 = 1; i ++){sum = fib1+fib2; fib1 = fib2; fib2 = sum;} return sum;}ハッシュテーブルはスレッドセーフクラスです。同期してハッシュテーブル全体をロックしてスレッドセーフティを実現します。つまり、テーブル全体を毎回ロックし、スレッドを占有します。 concurrenthashmapを使用すると、複数の変更操作を同時に実行できます。重要なのは、ロック分離テクノロジーの使用です。複数のロックを使用して、ハッシュテーブルのさまざまな部分への変更を制御します。
concurrenthashmapは、セグメント(セグメント)を使用してこれらの異なる部分を表します。各セグメントは実際には小さなハッシュテーブルであり、独自のロックがあります。異なるセグメントで複数の変更操作が発生する限り、それらは同時に実行できます。
size()やcontainsvalue()などのセグメントを越える必要があります。特定のセグメントではなく、テーブル全体をロックする必要がある場合があります。これには、すべてのセグメントを順番にロックする必要があります。操作が完了した後、すべてのセグメントのロックが順番にリリースされます。ここでは「順番」が非常に重要です。そうしないと、デッドロックの可能性が高くなります。 concurrenthashmapでは、セグメント配列が最終的であり、そのメンバー変数が実際に最終的です。ただし、アレイをファイナルとして宣言するだけでは、配列メンバーが最終的であることを保証するものではなく、実装保証が必要です。
これにより、ロックが取得される順序が固定されているため、デッドロックがないことが保証されます
①threadlocal②synchronized()③wait()and notify()
threadlocal
Threadlocalは、異なるスレッドに異なるインスタンスがあることを保証し、同じスレッドが同じインスタンスを持つ必要があります。つまり、変数を使用して各スレッドは変数の値のコピーを提供します。各スレッドは、他のスレッドのコピーと競合するのではなく、独自のコピーを独立して変更できます。
利点:スレッドセーフ共有オブジェクトを提供します
他の同期メカニズムとの違い:同期メカニズムは、複数のスレッドで同じリソースへの同時アクセスを同期させ、複数のスレッド間で通信することです。
Threadlocalは、複数のスレッドから分離されたデータ共有であり、基本的に複数のスレッド間でリソースを共有していません。これは確かに、複数のスレッドを同期する必要はありません。
揮発性
揮発性変更されたメンバー変数は、スレッドでアクセスするたびに、共有メモリからメンバー変数の値を再確認することを余儀なくされます。そして、
メンバー変数が変更されると、スレッドは変更値を共有メモリに戻すことを余儀なくされます。
利点:このように、いつでも、2つの異なるスレッドは常に特定のメンバー変数と同じ値を表示します。
理由:Java言語仕様では、最適な速度を得るために、スレッドは共有メンバー変数のプライベートコピーを保存することが許可されていると述べています。
また、スレッドが同期コードブロックに入るまたは出るときの共有メンバー変数の元の値とのみ比較されます。
このようにして、複数のスレッドがオブジェクトと同時に相互作用する場合、スレッドが共有メンバー変数の変更をタイムリーに取得できるようにするために注意を払う必要があります。
揮発性キーワードはVMをプロンプトします。このメンバー変数については、プライベートコピーを保存することはできませんが、共有メンバー変数と直接対話する必要があります。
使用のヒント:2つ以上のスレッドでアクセスされるメンバー変数で揮発性を使用します。
アクセスする変数が既に同期されたコードブロックに既にある場合、または定数である場合、使用する必要はありません。
効率を改善するために、スレッドはメンバー変数(aなど)(bなど)をコピーし、スレッド内のAへのアクセスは実際にBにアクセスします。AとBの同期は特定のアクションでのみ実行されるため、AとBが矛盾する状況があります。揮発性は、この状況を回避するために使用されます。
VolatileはJVMに、変更する変数はコピーを保持し、メインメモリ内のコピーに直接アクセスしないことを伝えます(多くの読み取り操作がある場合は使用する方が良いです。スレッド間で通信が必要ですが、この記事はそれを行うことはできません)
揮発性変数には、可視性特性が同期されていますが、原子特性はありません。
これは、スレッドが揮発性変数の最新値を自動的に発見できることを意味します。揮発性変数は、スレッドの安全性を提供するために使用できますが、非常に限られたユースケースのセットにのみ適用できます。複数の変数または変数の現在の値と変更された値の間に制約はありません。
限られたケースでは、ロックの代わりに揮発性変数のみを使用できます。揮発性変数の理想的なスレッドの安全性を実現するには、次の2つの条件を同時に満たす必要があります。
変数への操作の書き込みは、現在の値に依存しません。変数は、他の変数とともに不変に含まれていません。
sleep()vs wait()
睡眠はスレッドクラス(スレッド)であり、このスレッドは指定された時間の実行を一時停止し、実行の機会を他のスレッドに送信しますが、監視ステータスは残り、その後自動的に再開されます。スリープを呼び出しても、オブジェクトロックは放出されません。
待機はオブジェクトクラスの方法です。このオブジェクトの待機方法を呼び出すと、スレッドがオブジェクトロックを放棄し、このオブジェクトを待っている待機中のロックプールに入ります。このオブジェクトのNotifyメソッド(またはNotifyAll)を発行した後にのみ、このスレッドはオブジェクトロックプールに入り、オブジェクトロックを取得する準備をし、実行状態に入ります。 (変数が揮発性として宣言された場合、アクセスするたびにメインメモリと一致します。変数が同期メソッドまたは同期ブロックでアクセスされる場合、メソッドまたはブロックの入り口でロックが取得され、メソッドまたはブロックが存在するときにロックが解放されると変数が同期されます。)
http://www.yjbys.com/news/202750.html
クライアントプログラムは、最初に特定のコンテナの役割を取得し、次に特定のコンテナロールを通じて特定のイテレーターの役割を取得する必要があります。
iterator it = new ArrayList.iterator();
1)内部表現を公開することなく、コンテナオブジェクトの内容にアクセスします。
2)コンテナオブジェクトの複数のトラバーサルをサポートします。
3)さまざまなコンテナ構造を通過するための統一されたインターフェイス(多型反復)を提供します。
新しいキーワードを使用}→コンストラクターが呼び出されました
クラスクラスのnewinstanceメソッドを使用}→コンストラクターは呼び出されました
コンストラクタークラスのnewinstanceメソッドを使用}→コンストラクター関数が呼び出されました
クローンメソッドの使用}→コンストラクターは呼び出されません
Deserializationの使用}→コンストラクターは呼び出されません
従業員emp2 =(従業員)class.forname( "com.employee")。newinstance();
または
従業員emp2 = employee.class.newinstance(); constructor constructor = employee.class.getConstructor();従業員EMP3 = constructor.newinstance();
クローン法を使用して、最初にクローン可能なインターフェイスを実装し、それによって定義されたクローンメソッドを実装する必要があります
従業員emp4 =(従業員)emp3.clone();
プログラムが開始されたとき、プログラムが一度に使用するすべてのクラスファイルをロードするわけではありません。代わりに、プログラムのニーズに応じて、Javaクラスロードメカニズム(クラスローダー)を介して特定のクラスファイルをメモリに動的にロードします。したがって、クラスファイルがメモリにロードされた後にのみ、他のクラスで参照できます。したがって、クラスローダーは、クラスファイルをメモリに動的にロードするために使用されます。
ブートストラップクラスローダー:スタートアップクラスローダーと呼ばれます。これは、Javaクラスロード階層のトップレベルクラスローダーであり、JDKのコアクラスライブラリをロードする責任があります。 java_home/jre/lib/ext/デフォルトで。
App ClassLoader:Application ClassPathディレクトリにすべてのJARとクラスファイルをロードする責任があるシステムクラスローダーと呼ばれます。
これにより、繰り返しの荷重を避けることができるため、父親がクラスをロードしたとき、チャイルドクラスローダーが再びロードする必要はありません。
セキュリティ要因を考慮して、このデリゲートモードを使用しない場合、Java Core APIで定義されているタイプをいつでも動的に置き換えることができ、非常に大きなセキュリティリスクをもたらすことを想像してみましょう。親の委任方法は、この状況を回避できます。これは、Startupで文字列がブートクラスローダー(bootstrcpクラスローダー)によって既にロードされているため、JDKのクラスローダー検索クラスのデフォルトアルゴリズムを変更しない限り、ユーザー定義のクラスローダーが書かれた文字列をロードすることはできません。
1.リクエストオブジェクトクライアントリクエスト、このリクエストにはGet/Postリクエストからのパラメーターが含まれ、顧客のニーズを理解してから応答することしかできません。
2。応答オブジェクトに関する関連情報は、顧客リクエストに応答します
3。セッションオブジェクトとは、クライアントからサーバーへのWebアプリケーションからサーバーから切断されるまで、クライアントとサーバー間のセッションを指します。
4. OUTオブジェクトはJSPWriterクラスのインスタンスであり、クライアントにコンテンツを出力するために一般的に使用されるオブジェクトです。
5.ページオブジェクトは、現在のJSPページ自体を指しています。これは、クラスのこのポインターに少し似ています。 Java.lang.Objectクラスのインスタンスです
6.アプリケーションオブジェクトは、ユーザー間でデータの共有を実現し、グローバル変数を保存できます。サーバーがシャットダウンするまでサーバーの起動から始まります
7。例外オブジェクトは例外オブジェクトです。実行プロセス中に例外が発生すると、このオブジェクトが生成されます。
8。PageContextオブジェクトは、JSPページのすべてのオブジェクトと名前空間へのアクセスを提供します
9.構成オブジェクトは、サーブレットが初期化されたときに情報を渡すためにJSPエンジンによって使用されます。
JSには関数がありますisnan(val)//それが数字の場合、それはfalseを返します
XMLDOMの解析、サックス解析、およびスタックス解析があります
xmldom:(xmldocumentobjectmodel)大きなファイルを処理すると、パフォーマンスが大きく悪化します。この問題は、多くのメモリを占めるDOMツリー構造によって引き起こされ、DOMはファイルを解析する前にドキュメント全体をメモリにロードする必要があります。これはXMLへのランダムアクセスに適しています。
sax :( simpleapiforxml)domとは異なり、saxはイベント駆動型のxml解析方法です。 XMLファイルを順番に読み取り、ファイル全体を一度にロードする必要はありません。ファイルの開始、ドキュメントの終了、タグの開始、タグの終了などのイベントに遭遇すると、XMLへの順次アクセスに適したコールバックイベントで処理コードを作成することにより、ユーザーがXMLファイルを処理するイベントをトリガーします。
STAX:(StreamingApiforXML)とその他の方法の違いは、アプリケーションがイベントストリームとしてXMLを処理できることです。これは、パフォーマンスと可用性に関して他の方法よりも優れています。
thread.getState()
上記は、編集者が編集したJavaインタビューの質問です。彼らがあなたに役立つことを願っています。ご不明な点がございましたら、メッセージを残してください。編集者は時間内に返信します!