20191227インタビューの概要

1.オブジェクト指向機能の特徴は何ですか

4つの主な特徴があります:カプセル化、抽象化、継承、多態性

  1. カプセル化:カプセル化は、ソフトウェアコンポーネントの優れたモジュール性を確保するための基盤です。カプセル化の目的は、ソフトウェアコンポーネントの「高い凝集性と低い結合」を実現し、プログラムの相互依存による変更を防ぐことです。オブジェクト指向プログラミング言語では、オブジェクトはカプセル化の最も基本的な単位です。オブジェクト指向のカプセル化は、従来の言語のカプセル化よりも明確で強力です。オブジェクト指向のカプセル化は、オブジェクトのプロパティと動作を記述するコードを「モジュール」、つまりクラスにカプセル化することです。プロパティは変数によって定義され、動作はメソッドによって定義され、メソッドは同じオブジェクトのプロパティに直接アクセスできます。通常の状況では、変数と変数にアクセスするメソッドを一緒に置くことを覚えている限り、クラス内のすべてのメンバー変数はプライベートとして定義され、このクラスのメソッドのみがこれらのメンバー変数にアクセスできます。オブジェクトのカプセル化を実現するために、このクラスに割り当てられるメソッドを見つけるのは簡単です。これは、基本的にオブジェクト指向プログラミングです。原則を把握します。同じものを操作するメソッドと関連メソッドを同じクラスに配置し、メソッドとデータが操作するデータを同じクラスに配置します。

  2. 抽象化:抽象化とは、いくつかの類似点と類似点を見つけて、それらをクラスに分類することです。このクラスでは、これらの類似点と共通点のみを考慮し、現在のテーマと目標に関連しない側面は無視します。現在の目標に関連する側面に焦点を当てます。例えば、アリと象を見ると、似ていると想像できます。抽象化には、動作の抽象化と状態の抽象化が含まれます。たとえば、Personクラス
    を次のように定義します。class Person {String name; int age;}人々はもともと非常に複雑なものであり、多くの側面がありますが、現在のシステムは人の名前と年齢のみを知る必要があるため、上記で定義したクラスでは名前と年齢の2つの属性のみが含まれていますが、これは抽象化の一種であり、抽象化を使用すると、目標に関連しない詳細を考慮することを回避できます。抽象化について私が理解しているのは、顕微鏡を使用して物事のすべての側面を調べることではありません。これは内容が多すぎますが、問題の境界を分割するのには適しています。現在のシステムで必要なものだけが考慮されます。

  3. 継承:クラスを定義して実装する場合、既存のクラスに基づいて続行し、既存のクラスによって定義されたコンテンツを独自のコンテンツとして使用し、新しいコンテンツを追加したり、元のコンテンツを変更したりできますこのメソッドは、継承などの特別なニーズにより適しています。継承は、サブクラスが親クラスのデータとメソッドを自動的に共有するためのメカニズムであり、これはクラス間の関係であり、ソフトウェアの再利用性と拡張性を向上させます。

  4. ポリモーフィズム:ポリモーフィズムとは、プログラムで定義された参照変数が指す特定の型を指し、参照変数を通じて発行されたメソッド呼び出しはプログラミング中には決定されず、プログラムの実行中にのみ決定されます。つまり、参照変数はこれは、どのクラスのインスタンスオブジェクトを指し、参照変数によって呼び出されるメソッドは、どのクラスで実装されたメソッドであり、操作中にプログラムによって決定される必要があります。特定のクラスはプログラムの実行時に決定されるため、ソースコードを変更せずに、参照変数をさまざまな異なるクラス実装にバインドできます。これにより、参照によって呼び出された特定のメソッドがそれに応じて、つまり変更なしに変更されます。プログラムコードは、プログラムの実行中にバインドされた特定のコードを変更できるため、プログラムは複数の実行状態(多態性)を選択できます。多態性により、ソフトウェアの柔軟性とスケーラビリティが向上します。たとえば、次のコードのUserDaoは、実行中にdaofactory.getDao()によって返される参照変数userDaoによってポイントされるインスタンスオブジェクトを定義するインターフェイスです。UserJdbcDao実装を参照することもあれば、UserHibernateDao実装を参照することもあります。このようにして、ソースコードを変更せずに、userDao.insertUser()メソッドによって呼び出される特定のコードを変更する、つまり、UserJdbcDaoのinsertUserメソッドが呼び出され、場合によっては呼び出しが行われる、userDaoが指す特定のクラス実装を変更できます。 UserHibernateDaoのinsertUserメソッド:UserDao userDao = daofactory.getDao(); userDao.insertUser(user);

2.文字列は最も基本的なデータ型です

これは基本的なデータ型ではなく、クラスを表すだけであり、参照型です。
基本的なデータ型は8つしかありません
:数値、バイト、短い、整数、長い
浮動小数点:浮動小数点、二重
文字:文字
ブール値:ブール値

3. intとIntegerの違い

  • 整数はintのラッパークラスで、intはjavaの基本データ型です
  • 整数変数は使用する前にインスタンス化する必要がありますが、整数変数は必要ありません
  • intはスタックに格納され、Integerオブジェクトの参照はスタックスペースに格納され、オブジェクトのデータはヒープスペースに格納されます
  • Integerのデフォルト値はnull、intのデフォルト値は0です。
  • Intは値の転送であり、スタック内のデータは不変であり、Integerオブジェクトは参照によって渡され、参照は不変ですが、参照が指す空間アドレスの値は変更できます
  • ジェネリックスはintをサポートしていませんが、整数をサポートしています

4. String、StringBuffer、StringBuliderの違い

クラス 最下層 可変 スレッドセーフ 実行速度 アプリケーションシナリオ
ストリング 最終文字値[] 不変 はい 遅い 少量のデータを操作する
StringBuffer char value [] 可変 はい 速い 1つのスレッドで大量のデータを操作する
StringBuilder char value [] 可変 いいえ 大量のデータのマルチスレッド操作

5.ランタイム例外と一般例外の違いは何ですか

実行時の例外:

  • メソッドが宣言なしで定義されると、ランタイム例外がスローされます
  • このメソッドを呼び出すときにこのランタイム例外をキャッチする必要はありません
  • ランタイム例外は、java.lang.RuntimeExceptionまたはjava.lang.Errorクラスから派生します

一般的な例外:
メソッドを定義するときは、スローされる可能性のあるすべてのチェック済み例外を宣言する必要があります。
このメソッドを呼び出すときは、そのチェック済み例外をキャッチする必要があります。それ以外の場合は、例外に渡す必要があります

6. ArrayList、Vector、LinkedListのストレージパフォーマンスと特性について話す

タイプ 最下層 お問い合わせ 追加または削除 スレッドセーフ 効率
配列リスト 配列 速い 遅い 安全でない 高い
ベクター 配列 速い 遅い 安全な
LinkedList リンクされたリスト 遅い 速い 安全でない 高い

7.コレクションとコレクションの違い

1. java.util.Collectionはコレクションインターフェイスであり、コレクションオブジェクトに対する基本的な操作のための一般的なインターフェイスメソッドを提供します。Collectionインターフェイスには、Javaクラスライブラリに多くの具体的な実装があります。Collectionインターフェースの意味は、さまざまな特定のコレクションに最大の統一された操作モードを提供することです
2. java.util.Collectionsは、コレクション操作に関連するさまざまな静的なポリモーフィックメソッドを含むラッパークラスです。このクラスは、Javaコレクションフレームワークを提供するツールクラスのように、インスタンス化できません

8. final、finally、finalizeの違い

Javaでは、finalを使用してクラス、メソッド、変数(メンバー変数またはローカル変数)を装飾できます。

  • 最終クラスのすべてのメンバーメソッドは暗黙的に最終メソッドとして定義され、クラスは継承できません。
  • 最後のメソッドは「最終、最終」を意味し、このメソッドはオーバーライドできません。
  • 最後のメンバー変数は定数を表し、1回だけ割り当てることができ、その値は割り当て後に変更されません。

最後に

  • 例外処理の一部。通常、IOストリームデータベース接続などのリソースを解放するために使用されます。
  • 一般的に言って、finallyのコードブロックは実行され、jvmが早期に終了する(system.exit())などの特別な状況下では実行されません。

ファイナライズ

  • ガベージコレクションに使用されるオブジェクトクラスのメソッド。通常、ガベージコレクターによって呼び出されます。呼び出す必要はありません。

9.オーバーロードとオーバーライドの違い

オーバーライド

  • メソッド名、パラメーター、戻り値は同じです。
  • サブクラスメソッドは、親クラスメソッドのアクセス権を狭めることはできません。
  • サブクラスメソッドは、親クラスメソッドよりも多くの例外をスローできません。
  • 親クラスと子クラスの間に存在します。
  • メソッドはfinalとして定義されており、書き換えることはできません。
  • オーバーライドされたメソッドをプライベートにすることはできません。それ以外の場合は、サブクラスで新しいメソッドを定義するだけで、それを上書きしません。

アプリケーション:
最も一般的なカバレッジは、インターフェースメソッドの実装です。通常、メソッドはインターフェースで宣言されます。実装するときは、インターフェース宣言のすべてのメソッドを実装する必要があります。
この一般的な使用法に加えて、サブクラスの親クラスのメソッドを上書きする可能性があります

過負荷

  • パラメータタイプ、番号、および順序の少なくとも1つが異なります。
  • 異なる値のみを返すメソッド名をオーバーロードすることはできません
  • クラス向け
  • アクセス許可、戻り値の型、スローされた例外によってオーバーロードできません
  • 例外のタイプとメソッドの数はオーバーロードに影響しません

まとめ

オーバーライドは異なるクラス間の動作であり、オーバーロードは同じクラスでの動作です。
オーバーロードメソッドは戻り値の型とは関係がないため、戻り値の型を変更できます。

10.同期と非同期の類似点と相違点は何ですか?また、それらはどのような状況で別々に使用されますか?

Javaには、同期と非同期の2つのタイプの対話があります。

同期相互作用:

リクエストの送信を指します。次のリクエストを送信する前に、戻るのを待つ必要があります。待機プロセスがあります。

非同期相互作用:

リターンを待たずにリクエストを送信することを指し、いつでも、つまり待たずに次のリクエストを送信できます。

違い:

1つは待機する必要があり、もう1つは待機する必要はありません。場合によっては、プロジェクト開発では待機せずに非同期対話方式を優先的に選択します。

同期相互作用の使用が推奨される状況は何ですか?

たとえば、銀行の振替システム、データベースのストレージ操作などは同期インタラクティブ操作を使用し、残りのケースでは非同期相互作用を使用することを好みます

11.抽象クラスとインターフェースの違いは何ですか

抽象クラス:

  • インスタンス化できません。参照を定義できます
  • 継承する抽象クラスは、すべての抽象メソッドを実装する必要があります。そうでない場合は、抽象クラスとして宣言する必要があります
  • コンストラクタを定義でき、抽象メソッドと具象メソッドを持つことができます
  • メンバーは、パブリック、デフォルト、保護、プライベートにすることができます
  • メンバー変数を定義できます
  • 抽象メソッドは抽象クラスである必要があります。抽象クラスには抽象メソッドがない場合があります

インターフェース

  • インスタンス化できません。参照を定義できます
  • インターフェイスを実装するには、すべての抽象メソッドを実装する必要があります。それ以外の場合は、抽象クラスとして宣言する必要があります
  • コンストラクタは定義できません。すべてのメソッドは抽象メソッドです
  • メンバーは公開されている必要があります
  • メンバー変数を実際に一定に定義できる

12、転送とリダイレクト

タイプ お願い アドレスバー データを共有する ジャンプ制限 違った振る舞い
フォワード 1 変化なし 共有データをリクエストする このサイトのリソースにのみジャンプできます サーバー側の動作
リダイレクト 2 変化 共有データを要求しない 任意のURLにジャンプ クライアントの行動

リダイレクトとは、ブラウザがサーバーにリクエストを送信し、レスポンスを受信して​​から、新しいアドレスにリクエストを送信することです。転送とは、サーバーがリクエストを受信し、新しいアドレスにジャンプしてレスポンスを完了することです。

13. EJBとJavaBeanの違い

  • JavaBeanはコンポーネントであり、EJBはフレームワークです
  • JavaBeanは、ビジネスロジックとプレゼンテーションレイヤーの表示を指向しています。JavaBeanを記述することにより、ビジネスロジックのイベントとものを配置し、変数属性を渡して、必要なコンテンツをプレゼンテーションレイヤーに表示できます。EJBは、サーバーにデプロイされた実行可能コンポーネントまたはビジネスオブジェクトです。EJBにはデプロイメント記述子があります。このデプロイメント記述子を使用して、EJBのプロパティを記述できます。EJBはプレゼンテーションレイヤーと対話しません。
  • EJBは一般的なJavaBeanではありません。EJBはエンタープライズレベルのJavaBeanです。EJBはエンティティBean、メッセージBean、セッションBeanの3つのタイプに分類されます。EJBの記述は特定の仕様に従う必要があります。特定の仕様は関連情報を参照できます。 EJBを実行するには、対応するEJBコンテナー(Weblogic、Jbossなど)が必要です。JavaBeanは不要で、Tomcatをインストールするだけで済みます。
  • EJBはサーバー側のアプリケーション開発に使用され、JavaBeansはクライアント側のアプリケーション開発に使用されます。JavaBeansはサーバー側のアプリケーション開発にも使用できますが、JavaBeansモデルはサービスフレームワークを提供しません。アプリケーションがシステムレベルのサービス(トランザクション管理、セキュリティ、ライフなど)を使用する必要がある場合サイクル管理等)は不向きです。
  • EJBコンポーネントはデプロイメント用にカスタマイズ可能です。デプロイメント記述子を使用すると、EJBをデプロイするときにランタイム構成をカスタマイズできますが、JavaBeansコンポーネントはデプロイメント中にカスタマイズできません。JavaBeansコンポーネントのカスタマイズは、開発フェーズでのみ発生し、開発ツールのみですJavaBeansコンポーネントは作成およびアセンブルされ、デプロイメント時にカスタマイズすることはできません。
  • EJBコンポーネントは分散オブジェクトであり、クライアントアプリケーションや他のEJBコンポーネントからリモートでアクセスできますが、JavaBeansコンポーネントは分散されません。JavaBeansコンポーネントは、それらが構成するアプリケーションでのみ使用でき、リモートアクセス機能を提供できません。
  • EJBコンポーネントはエンドユーザーには見えず、サーバー側で実行され、人間とコンピューターの対話インターフェースはありませんが、GUIアプリケーションで使用されるボタンコンポーネントなどのJavaBeansコンポーネントはエンドユーザーに表示されます

14. assertを使用する場合

アサーションはソフトウェア開発における一般的なデバッグ方法であり、多くの開発言語がこのメカニズムをサポートしています。一般に、アサーションはプログラムの最も基本的で重要な正確性を保証するために使用されます。アサーションチェックは、通常、開発およびテスト中にオンになりますが、プログラムの実行効率を確保するために、ソフトウェアのリリース後はアサーションチェックはオフになっています。アサーションはブール式を含むステートメントです。ステートメントが実行されると、式はtrueであると見なされます。式の値がfalseの場合、システムはAssertionErrorを報告します

15. 4つのスレッドを設計します。そのうち2つはjを1ずつ増やし、他の2つのスレッドはjを1ずつ減らし、プログラムを記述します。

16. run()またはstart()でスレッドを開始するかどうか

スレッドを開始するには、start()メソッドを使用する必要があります。start()を使用してスレッドを開始すると、スレッドは準備完了状態になり、仮想プロセッサがスレッドによって表される実行可能な状態になります。つまり、JVMによってスケジュールおよび実行できます。これは、スレッドがすぐに実行されるという意味ではありません。CPUが時間を割り当てると、run()メソッド(存在する場合)の実行を開始します。start()はメソッドで、run()メソッドを呼び出し、run()メソッドは書き換える必要があります。run()メソッドにはスレッド本体が含まれています。

17.アプリケーションサーバーとは

  • Tomcat:フリーでオープンソースの軽量アプリケーションサーバー。中小規模のシステムや同時アクセスユーザーで広く使用されています。JSPプログラムの開発とデバッグの最初の選択肢です。Tomcat部分は実際にはApacheサーバーの拡張ですが、独立して実行されるため、tomcatを実行すると、実際にはApacheとは別のプロセスとして実行されます。JSP /サーブレットの関連仕様のみが実装され、EJBはサポートされていません
  • Jettyは無料でオープンソースであり、アーキテクチャは比較的シンプルです。また、スケーラブルで非常に柔軟なアプリケーションサーバーでもあります。JettyはJava言語で記述され、そのAPIは一連のJARパッケージの形でリリースされます。開発者はJettyコンテナーをオブジェクトにインスタンス化して、スタンドアロンのJavaアプリケーションをすばやく提供できます

18.インターフェースがインターフェースを継承できるかどうか

インターフェースと通常のクラスの間:

  • インターフェースは複数のインターフェースを継承できます。インターフェースCはA、Bを拡張します{}
  • クラスは複数のインターフェースを実装できます:クラスDはA、B、Cを実装します{}
  • クラスは1つのクラスのみを継承でき、複数の継承はできません。クラスBはAを拡張します{}
  • クラスは、クラスを継承しながら1つ(または複数)のインターフェースを実装できます。クラスEは、Dが拡張し、A、B、Cを実装します{}

インターフェース間、通常クラス、抽象クラス

  • 抽象クラスはインターフェースを実装できます
  • 抽象クラスは通常のクラスを継承できます

19.データ接続プールの動作メカニズムは何ですか?

データ接続プールは、tomcatなどの中間サーバーにデータベース接続を配置することです。これは、データベースに「接続」し、データベースを操作するたびに関連する操作を実行する必要はなく、サーバー上の「接続」を直接操作することと同じです。 "プール" ..このようにして、 "効率"を向上させることができます。ただし、データプールは通常、データ量の多いプロジェクトで使用されるため、プログラムの効率を向上させることができます。これにより、サーバーに関連する負荷がかかるかどうかを検討してください。一番上にあるのは、この「プール」がサーバー上にあるため、データ量が少ないプロジェクトにはお勧めしません。リクエストが多すぎると、サーバーの負荷が大きくなります
。J2EEサーバーが起動すると、特定の数のプール接続が確立および維持されますこのプール接続数以上。クライアントプログラムが接続する必要がある場合、プールドライバーは未使用のプール接続を返し、ビジーとしてマークします。現在アイドル状態の接続がない場合、プールドライバは特定の数の接続を作成します。新しい接続の数は、構成パラメータによって決定されます。使用されたプール接続呼び出しが完了すると、プールドライバーはこの接続テーブルをアイドルとして記録し、他の呼び出しはこの接続を使用できます。

20.配列にlength()メソッドはありますか?文字列にlength()メソッドはありますか?

配列:長さプロパティ
文字列:長さ()メソッド
リスト:サイズ()メソッド

21.コンストラクタConstructorをオーバーライドできますか?

コンストラクターは継承できないため、オーバーライドをオーバーライドすることはできませんが、オーバーロードできます。

コンストラクターは継承できないため、コンストラクターをオーバーライドできません。各クラスには、独自のコンストラクターが必要です。コンストラクターは、独自の構築部分を構築する責任があります。サブクラスは親クラスのコンストラクターをオーバーライドしませんが、最初に親クラスのコンストラクターを呼び出す必要があります。

22. MVCの各部分を実装するためにどのようなテクノロジーが使用されていますか?それを達成する方法は?

  • モデル:JavaBean
    (hibernate、mybatis、ibatis)によって実装されるアプリケーションのビジネスロジック(データベースの操作など
  • view:主にjspページによって生成される、ユーザーとの対話に使用されるビューレイヤー。
    (Jsp、FreeMarker、tails、taglib、EL、Velocity)
  • コントローラー:プロセス制御、通常はサーブレット。

ユーザーの要求をディスパッチし、表示に適したビューを選択したり、
ユーザーの入力を解釈してモデルレイヤーが実行できる操作にマップしたりできます。
(セブレット、ストラット、スプリング、アクション)

23. Javaでスレッドを実装する方法はいくつかありますか?同期方法を変更するキーワードは何ですか?停止()および一時停止()メソッドが推奨されない理由

  • 実装方法には、Threadクラスの継承とRunnableインターフェースの実装の2つがあります。
  • 新しいThread()および新しいThread(実行可能)フォームをそれぞれ使用し、同期されたキーワードを使用して同期方法を変更します。
  • 最初のメソッドはスレッドのrunメソッドを直接呼び出すため、Threadサブクラス、つまり新しいSubThread()をよく使用します。
  • 2番目のメソッドは、runnableのrunメソッドを呼び出します。
    java5以前は、次の2つがありました。

最初の種類:
new Thread(){}。Start();これは、スレッドサブクラスオブジェクトのrunメソッドを呼び出すことを意味し、new Thread(){}は、runメソッドをサブクラスに追加した後、Threadの匿名サブクラスのインスタンスオブジェクトを意味しますコードは次のとおりです。

new Thread(){
      public void run(){
     } 
 }.start();

2番目の種類:
新しいスレッド(新しいRunnable(){})開始();これは、スレッドオブジェクトによって受け入れられたRunnableオブジェクトのrunメソッドの呼び出しを意味し、新しいRunnable(){}は、Runnable、runnableの匿名サブクラスのインスタンスオブジェクトを意味しますrunメソッドをのサブクラスに追加した後のコードは次のとおりです。

 new Thread(new Runnable(){
         public void run(){
         } 
     }
  ).start(); 

java5以降、スレッドプールにマルチスレッドを作成する方法はいくつかあります。

ExecutorService pool = Executors.newFixedThreadPool(3)
  for(int i=0;i<10;i++){
     pool.execute(new Runable(){
         public void run(){
         }
     });
 }
 Executors.newCachedThreadPool().execute(new Runable(){
     public void run(){
     }
 });
 Executors.newSingleThreadExecutor().execute(new Runable(
     {public void run(){
     }
 });   

stop()メソッドは大まかなスレッド終了動作であり、スレッドが終了する前にクリーンアップ操作を行わないため、本質的に安全ではありません。Thread.stop()メソッドを使用してスレッドを終了すると、スレッドによって取得されたすべてのロックが解放され、オブジェクトが不連続な状態にある場合、他のスレッドはその状態でそれらを確認および変更できます。その結果、実際の問題をチェックすることは困難です。上記の理由により、stop()メソッドは使用しないでください。フラグを独自のThreadクラスに配置して、ターゲットスレッドがアクティブか停止かを制御する必要があります。フラグが実行を停止することを示している場合は、run()メソッドで終了できます。ターゲットスレッドが長時間待機する場合は、割り込み()メソッドを使用して待機を中断する必要があります。

suspend()メソッドこのメソッドは、デッドロックが発生する傾向があるため、反対されました。suspend()メソッドが呼び出されると、ターゲットスレッドは停止します。重要なシステムリソースを保護するモニターでターゲットスレッドがハングした場合、ターゲットスレッドが再起動するまで、他のスレッドはリソースにアクセスできません。中断されたスレッドが実行を再開しない限り。その他のスレッドでは、ロックされたリソースを使用しようとしているときにターゲットスレッドを復元すると、デッドロックが発生します。上記の理由により、suspend()メソッドを使用しないでください。ただし、スレッドをアクティブにするか中断するかを制御するために、独自のスレッドクラスにフラグを設定する必要があります。フラグがスレッドを中断する必要があることを示している場合は、wait()メソッドを使用して、スレッドに待機状態に入ることを指示します。フラグがスレッドを再開する必要があることを示している場合は、notify()メソッドを使用してスレッドを再起動します。

公開された18件のオリジナル記事 いいね1 訪問1417

おすすめ

転載: blog.csdn.net/qiteng_sijia/article/details/103737499