Java の面接での質問 (仕事を探すときに必ず読んでください)

怪我咯
リリース: 2017-06-26 11:45:35
オリジナル
1809 人が閲覧しました

個人的な参考資料の要約です。類似点はまったくの偶然です。

1. ハッシュマップの実装原理とハッシュテーブルのスレッドセーフはどのように実装されていますか?
HashMapは実際には線形配列として実装されているため、データを格納するコンテナは線形配列であることがわかります。
まず、静的内部クラス Entry を HashMap に実装します。その重要な属性はキー、値、次に属性のキーと値から、Entry が HashMap のキーと値のペアの実装の基本 Bean であることがわかります。 HashMap の基本は線形配列であり、この配列は Entry[] であり、Map の内容は Entry[] に格納されます。
HashTable コンテナはスレッドの安全性を確保するために synchronized を使用しますが、スレッドの競争が激しい場合、HashTable の効率は非常に低くなります。スレッドが HashTable の同期メソッドにアクセスすると、他のスレッドが HashTable の同期メソッドにアクセスするときにブロック状態またはポーリング状態になる可能性があるためです。 ConcurrentHashMap で使用されるロック セグメンテーション テクノロジは、まずデータをストレージ用のセグメントに分割し、次にデータの各セグメントにロックを割り当てます。スレッドがデータの 1 つのセグメントにアクセスするためにロックを占有すると、他のセグメントのデータにもアクセスできます。他のセグメントによるアクセス。

2. ハッシュマップの put() と get() の実装原理は何ですか? 最初のキーと値のペア A が入力され、そのキーのハッシュを計算して得られたインデックス = 0 が Entry[0] = A として記録されます。しばらくすると、別のキーと値のペア B が入ってきます。計算により、そのインデックスは 0 に等しくなります。どうすればよいでしょうか。 HashMap はこれを実行します: B.next = A, Entry[0] = B。C が再び入力されると、インデックスも 0 に等しく、このようにして C.next = B, Entry[0] = C が見つかります。 Index = 0 の場所 実際には、3 つのキーと値のペア A、B、および C がアクセスされ、それらは次の属性を通じてリンクされます。ご質問があってもご心配なく。つまり、最後に挿入された要素が配列に格納されます。
get() は最初に位置を特定し、次に走査します。


3. 春インゲン豆のライフサイクル? Spring では、singleton 属性はデフォルトで true ですが、false に設定されている場合に限り、エイリアスによって取得された Bean が指定されるたびに新しいインスタンスが生成されます。
3.1: Bean の作成: コンテナは Bean の定義情報を検索し、インスタンス化します。
3.2: 属性の注入。
3.3: BeanNameAware
3.4: BeanFactoryAware の setBeanFactory()
3.5: BeanPostProcessors の ProcessBeforeInitialization()
3.6: Bean の afterPropertiesSet() を初期化する:
3.7: Bean 定義ファイルで init-method を定義する:
3.8: AfterInitialization() の処理
DisposableBean の destroy()、destroy-メソッドは Bean 定義ファイルで定義されています


4. Spring はどのようにトランザクションを管理しますか? Spring トランザクションは Spring AOP の実装であると言えます。リフレクションと動的プロキシ。

AOP アスペクト指向プログラミングとは、ソース コードを変更せずに元の機能を拡張し、プロキシ クラスを通じて特定のクラスを操作することを意味します。

Springはコンテナであり、オブジェクトはSpringコンテナを通じて管理され、Springは設定ファイルに従ってオブジェクトを管理します。

Spring のトランザクション宣言には、プログラムによるものと宣言的なものという 2 つの方法があります。 Spring は主に「宣言型トランザクション」、つまり設定ファイルで宣言することでトランザクションを管理し、トランザクション部分は AOP を通じてプログラムに組み込まれるため、コード量が大幅に削減されることが最大の利点です。


5. サービス層は単一のインスタンスですか、それとも複数のインスタンスですか?スレッドは安全ですか?複数のインスタンスを実行したい場合はどうすればよいでしょうか? Spring によって生成されるオブジェクトは、デフォルトではシングルトンです。これは、scope 属性を通じて複数のインスタンスに変更できます。


5.1. サーブレットは、厳密にはシングルトン インスタンスに対応します。 5.2. サーブレット スレッドの安全性を維持するには、通常、同期ブロック (またはメソッド) を使用して、一部のロック メカニズムを安全に開くこともできます。同時に、スレッドの安全性を確保するために、相手のスレッドをブロックするとパフォーマンスが非常に低下します。マルチスレッドの同時実行を防ぐために、C レイヤーで変数を定義しないでください。

6. 物事の広がり?データベース分離レベル?

PROPAGATION_REQUIRED トランザクションが存在する場合、現在のトランザクションがサポートされます。トランザクションがない場合に有効にする PROPAGATION_SUPPORTS トランザクションがある場合、現在のトランザクションをサポートします。トランザクションが存在しない場合、非トランザクション実行
PROPAGATION_MANDATORY トランザクションが既に存在する場合、現在のトランザクションをサポートします。アクティブなトランザクションがない場合は、例外がスローされます。
PROPAGATION_REQUIRES_NEW は常に新しいトランザクションを開始します。トランザクションがすでに存在する場合、既存のトランザクションは一時停止されます。
PROPAGATION_NOT_SUPPORTED 常に非トランザクションで実行し、既存のトランザクションを一時停止します。
PROPAGATION_NEVER は常に非トランザクションで実行され、アクティブなトランザクションが存在する場合は例外がスローされます。
PROPAGATION_NESTED アクティブなトランザクションが存在する場合は、ネストされたトランザクションで実行されます。アクティブなトランザクションが存在しない場合、
は TransactionDefinition に従って実行されます。 PROPAGATION_REQUIRED プロパティ
デフォルトでは、
PROPAGATION_REQUIRED
を使用します

①シリアライズ可能:ダーティリード、ノンリピータブルリード、ファントムリードの発生を回避できます。

② リピータブルリード:ダーティリードやノンリピータブルリードの発生を回避できます。

③ Read commit: これにより、ダーティリードの発生を回避できます。

④ Read uncommitted (read uncommitted): 最も低いレベルで、いかなる状況でも保証はありません。
一般データベースのデフォルト レベルは読み取りコミットです。

MySQL のデフォルトの分離レベルは反復読み取りです。

MySQL データベースの現在のトランザクションの分離レベルを表示します:

select @@tx_isolation;
MySQL データベースのトランザクションの分離レベルを設定します:

set [glogal session] トランザクション分離レベル分離レベル名;

set tx_isolation='分離レベル名;'
注意: データベースの分離レベルはトランザクションを開始する前に設定する必要があります。

7. Arraylist はどのようにしてスレッド セーフを実現しますか?
このスレッド セーフティの問題を解決するには、次のように Collections.synchronizedList() を使用できます。

List> data=Collections.synchronizedList(new ArrayList > ());
8. Tomcat のメモリ サイズを設定するにはどうすればよいですか?
Tomcat が使用できるデフォルトのメモリは 128MB ですが、大規模なアプリケーション プロジェクトでは、このメモリでは不十分であるため、メモリを増やす必要があります。いくつかの方法から選択できます:

最初の方法:

Windows ではファイル /bin/catalina.bat に、Unix ではファイル /bin/catalina.sh の前に次の設定を追加します。

JAVA_OPTS ='-Xms [初期化メモリサイズ] -Xmx [使用できる最大メモリ]'

これら2つのパラメータの値を増やす必要があります。例:

JAVA_OPTS='-Xms256m -Xmx512m'

初期メモリが256MBで、使用できる最大メモリが512MBであることを意味します。

2つ目の方法:環境変数に設定する 変数名:JAVA_OPTS 変数値:-Xms512m -Xmx512m

3つ目の方法:最初の2つの方法はbinディレクトリにcatalina.batがある場合(直接解凍したものなど) Tomcat など)、インストールされている Tomcat の一部のバージョンには catalina.bat がありません。もちろん、この方法は最も一般的な方法でもあります: tomcatHome//bin//tomcat5w を開きます。 exe で [Java] タブをクリックすると、[初期メモリ プール] と [最大メモリ プール] の 2 つの項目があることがわかりました。[初期メモリ プール] は、初期化されたメモリのサイズです。最大メモリ プールは最大メモリ サイズです。設定後、OK を押して TOMCAT を再起動すると、Tomcat の jvm に使用できるメモリが変更されたことがわかります
catalina.bat の @echo off の下に追加します (2 行目)。
JAVA_OPTS=-server -Xms512m -Xmx1024m -XX:MaxNewSize=512m -XX:MaxPermSize=256m

9 サーブレットのデフォルト実装クラス?

lServlet インターフェース SUN Company は、GenericServlet と HttpServlet という 2 つのデフォルト実装クラスを定義しています。 GET リクエストの場合は、HttpServlet の doGet メソッドを呼び出します。Post リクエストの場合は、doPost メソッドを呼び出します。したがって、開発者がサーブレットを作成するときは、通常、サービス メソッドを上書きするのではなく、doGet メソッドまたは doPost メソッドをオーバーライドするだけで済みます

以上がJava の面接での質問 (仕事を探すときに必ず読んでください)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート