JavaRush /Java Blog /Random-JA /Java開発者へのインタビューからの質問と回答の分析。パート1
Константин
レベル 36

Java開発者へのインタビューからの質問と回答の分析。パート1

Random-JA グループに公開済み
こんにちは!JavaRushには様々な人が集まりました。私たちの中には、開発に多くの時間と労力を費やして Java 開発者になりたいだけの人もいれば、すでに Java 開発者である人もいます。いずれの場合も、技術面接などのテストの準備をする必要があります。この試験は簡単ではなく、精神的な準備に加えて技術的な準備も必要です。 最近、dou でJava 開発者インタビューの質問インタビューの質問と回答の分析。 パート 1 - 1の膨大なリストを見つけました。これらの質問は、ジュニア、ミドル、シニアのさまざまなレベルに分かれています。心配しないでください。すべての質問が簡単なわけではありませんが、アスタリスクが付いている質問はめったに聞かれません。質問は結構ですが、ほとんどの質問に答えたいと思います。1 つの記事の範囲には触れないことは明らかです。結局のところ、そこには多くの質問があります。したがって、これはそのような質問に答える一連の記事になります。すぐにいくつかの点を強調しましょう。
  1. よくある質問とその回答を掲載した優れた記事があります。一部の質問は上記のリスト (250 以上) と重複するため、情報が再び重複しないように、これらの質問はスキップされます。

  2. 質問はウクライナ語で表示されますが、JavaRush 参加者の大多数はロシア語を話す人であるため (そしてかなりの程度私も)、答えはロシア語で行われます。

  3. 非常に詳しく書くと、質問によっては別の記事で回答する必要があるため、回答は簡潔にします。また、面接では、そのような詳細で膨大な回答は必要ありません。なぜなら、面接官が必要なトピックについて面接する時間は 1 時間しかないからです (覚えていると思いますが、それだけで十分です)。さらに深く掘り下げたい人のために、リンクを残しておきます。

それでは、始めましょう。

ジュニアレベルの質問と回答

インタビューの質問と回答の分析。 パート 1 ~ 2

一般的な問題

1. どのようなデザインパターンを知っていますか? あなたの仕事で使用した 2 つのテンプレートについて教えてください。

非常に多様なテンプレートがあります。この記事とこの記事からテンプレートについて知り始めることができます。詳しいことを知りたい方は、『Head First』という本を読むことをお勧めします。デザインパターン"。これを利用すると、最も基本的なデザイン パターンを詳細かつ簡単な方法で学習できます。面接で例として使用できるデザイン パターンというと、次のようなものが思い浮かびます。
  • Builder は頻繁に使用されるテンプレートであり、従来のオブジェクト作成の代替手段です。
  • 戦略パターン: 本質的にポリモーフィズムを表します。つまり、インターフェイスは 1 つですが、このインターフェイスのどの特定の実装が機能に転送されたかによって、プログラムの動作が変わります (現在、この戦略は Java アプリケーションのあらゆる場所で実際に使用されています)。
これだけでは十分でない場合は、 Springに注目してください(すでに慣れている場合)。Spring はフレームワークのプラットフォーム全体であり、上下にパターンが満載だからです。ここで私が話していることの例をいくつか示します。
  • Factory - ApplicationContext (または BeanFactory) 内。
  • シングルトン- すべての Bean はデフォルトでシングルトンです。
  • プロキシ- 基本的に Spring のすべてのものは、何らかの方法でこのパターンを使用します (AOP など)。
  • 責任の連鎖は、Spring Security が機能する概念に基づくパターンです。
  • テンプレート- Spring Jdbc で使用されます。

Javaコア

インタビューの質問と回答の分析。 パート 1 ~ 3

2. Java にはどのようなデータ型がありますか?

Javaにはプリミティブなデータ型があります。
  • byte — -128 ~ 127 の範囲の整数、重みは 1 バイトです。
  • short — -32768 ~ 32767 の範囲の整数、重みは 2 バイトです。
  • int — 整数 -2147483648 ~ 2147483647、重みは 4 バイト。
  • long — 9223372036854775808 ~ 9223372036854775807 の範囲の整数、重みは 8 バイトです。
  • float — -3.4E+38 ~ 3.4E+38 の範囲の浮動小数点数、重みは 4 バイトです。
  • double — -1.7E+308 ~ 1.7E+308 の範囲の浮動小数点数、重みは 8 バイトです。
  • char — UTF-16 の単一文字、重さは 2 バイト。
  • ブールtrue/false、重みは 1 バイトです。
そして、ヒープ上のオブジェクトを指す参照データ型。

3. オブジェクトはプリミティブ データ型とどのように異なりますか?

最初の違い: 占有されるメモリの量: プリミティブには独自の値のみが含まれるため、占有されるメモリの量はほとんどありませんが、オブジェクトには非常に多くの異なる値 (プリミティブと他のオブジェクトへの参照の両方) が含まれる可能性があります。2 番目の違い: Java はオブジェクト指向言語であるため、Java 内のすべてのものがオブジェクト間の対話を通じて機能し、プリミティブはあまり適合しません (実際、これが Java が 100% オブジェクト指向言語ではない理由です)。3 番目は 2 番目の続きです。Java はオブジェクト間の対話に重点を置いているため、これらのオブジェクトにはオブジェクトを管理するためのさまざまなメカニズムが備わっています。たとえば、コンストラクター、メソッド、例外 (主にオブジェクトに対して動作します) などです。実際、プリミティブが何らかの方法でこのオブジェクト指向環境に関与 (機能) できるように、プリミティブ型 ( IntegerCharacterDoubleBoolean ...)用のラッパーが発明されました。

4. パラメータを参照渡しと値渡しの違いは何ですか?

プリミティブ フィールドには値が保存されます。たとえば、int i = 9 に設定した場合、フィールドiには値9が格納されます。オブジェクトへの参照があるということは、そのオブジェクトへの参照、つまりメモリ内のオブジェクトのアドレスの値を含むフィールドがあることを意味します。
Cat cat = new Cat();
オブジェクトへの参照を持つフィールドには、値、メモリ アドレス値 も格納されることがわかります。つまり、cat は新しい Cat()オブジェクトのアドレス値をメモリに保存します。パラメータをメソッドに渡すと、その値がコピーされます。プリミティブの場合、プリミティブの値がコピーされます。したがって、この方法はコピーで機能し、変更はオリジナルには影響しません。参照型の場合、メモリ アドレスの値がそれぞれコピーされ、アドレスはそれが指すオブジェクトと同じになります。この新しいリンクを使用してオブジェクトを変更すると、古いリンクも変更されます (結局のところ、両方とも同じオブジェクトを指しているためです)。

5. JVM、JDK、JREとは何ですか?

JVM - Java 仮想マシンは、コンパイラによって事前に生成された Java バイトコードを実行する仮想マシンです。 JRE (Java ランタイム環境) は本質的に Java アプリケーションを実行するための環境であり、これにはJava プログラミング言語で記述されたアプレットやアプリケーションを実行するためのJVM、標準ライブラリ、その他のコンポーネントが含まれています。言い換えれば、 JRE はコンパイルされた Java プログラムを実行するために必要なものすべてのパッケージですが、アプリケーション開発用のコンパイラやデバッガなどのツールやユーティリティは含まれていません。 JDK - Java Development Kit - JREの拡張セット、つまり、Java アプリケーションを起動するだけでなく開発するための環境です。JDK には、JRE に含まれるすべてのものに加えて、Java でアプリケーションを作成するために必要なさまざまな追加ツール (Java ドキュメントも含まれる) のコンパイラーやデバッガーが含まれています。インタビューの質問と回答の分析。 パート 1 ~ 4

6. なぜ JVM を使用するのですか?

前述したように、Java 仮想マシンは、コンパイラによって事前に生成された Java バイトコードを実行する仮想マシンです。つまり、JVM は Java ソース コードを理解できません。したがって、最初に.javaファイルがコンパイルされます。コンパイル後、ファイルにはすでに.class拡張子が付けられており、JVM が理解できるものと同じバイト コードの形式で表示されます。各 OS には独自の JVM があるため、バイトコード ファイルを受信した JVM はそれを実行し、それが発生する OS に適応させます。実際には、JVM が異なるため、JDK (または JRE) のバージョンは OS ごとに異なります (OS ごとに独自の JVM が必要です)。他のプログラミング言語で開発がどのように行われるかを思い出してみましょう。プログラムを開発すると、そのコードが特定の OS 用のマシン コードにコンパイルされ、実行できるようになります。つまり、システムごとに異なるバージョンのプログラムを作成する必要があります。一方、Java では、二重コード処理 (JVM コード バイトのコンパイルと処理) のおかげで、クロスプラットフォームの利点を享受できます。コードを作成してバイトコードに再コンパイルし、任意の OS に転送すると、ローカル JVM がコードを実行します。これは Java の伝説的な特性であり、一度書けばどこでも実行できますインタビューの質問と回答の分析。 パート 1 ~ 5詳細については、記事「内部での Java アプリケーションのコンパイルと実行」を参照してください。

7. バイトコードとは何ですか?

上で述べたように、コンパイラは Java コードを中間バイトコード(拡張子 .java を持つファイルを拡張子 .class を持つファイル) に変換します。バイトコードは多くの点でマシンコードに似ていますが、実際のプロセッサではなく仮想プロセッサからの一連の命令を使用する点が異なります。さらに、プログラムが実行されている実際のプロセッサに対するコマンドの実行を最適化する JIT コンパイラの使用に焦点を当てたセクションが含まれる場合があります。JIT コンパイルは、オンザフライ コンパイルとも呼ばれ、プログラムの実行中にバイトコードをマシンまたはその他の形式にコンパイルすることによって、バイトコードを使用するプログラムのパフォーマンスを向上させるテクノロジです。ご想像のとおり、JVM はバイトコードを実行するときに JIT コンパイラーを使用します。バイトコードの例を見てみましょう。インタビューの質問と回答の分析。 パート 1 ~ 6あまり読みにくいですね。これは私たちに対する指示ではなく、JVM に対する指示です。この問題をより深く理解するのに役立つ記事を次に示します。

8. JavaBean の特徴は何ですか?

JavaBeans は、特定のルールを持つ Java クラスです。JavaBean を作成するためのいくつかのルールを次に示します。
  1. クラスには、 public アクセス修飾子を備えた空の (パラメーターなし) パブリック アクセス コンストラクターが含まれている必要があります。このコンストラクターを使用すると、不必要な問題を発生させずにこのクラスのオブジェクトを作成できるようになります (パラメーターに不必要な手間がかからなくなります)。

  2. クラスの内部フィールドには、標準のgetメソッドとsetメソッドを通じてアクセスします。たとえば、フィールドが name の場合、getNamesetNameなどになります。これにより、さまざまなツール (フレームワーク) が複雑な作業なく Bean の内容を自動的に決定して更新できるようになります。

  3. クラスには、equals()メソッドhashCode()およびtoString()のオーバーライドされたバージョンが含まれている必要があります。

  4. クラスはシリアル化可能である必要があります。つまり、マーカー インターフェイス (シリアル化可能) を備えているか、外部化可能なインターフェイスを実装している必要があります。これは、Bean の状態を確実に保存、保存、復元できるようにするために必要です。

インタビューの質問と回答の分析。 パート 1 ~ 7JavaBeans のタイプについては、この資料を参照してください。

9. OutOfMemoryError とは何ですか?

OutOfMemoryError は、Java 仮想マシン (JVM) の動作に関連する重大なランタイム エラーの 1 つです。使用可能なメモリが十分になく、ガベージ コレクターがそれ以上のメモリを割り当てることができないため、JVM がオブジェクトを割り当てることができない場合に呼び出されます。いくつかの種類の OutOfMemoryError :
  • OutOfMemoryError: Java ヒープ スペース- メモリ不足のため、オブジェクトを Java ヒープに割り当てることができません。このエラーは、メモリ リーク、またはデフォルトのヒープ サイズが現在のアプリケーションにとって十分な大きさではないことが原因である可能性があります。

  • OutOfMemoryError: GC オーバーヘッド制限を超えました- データ量がヒープにほとんど収まらないため、ガベージ コレクターが常に実行され、Java プログラムの実行が非常に遅くなり、その結果、ガベージ コレクターのオーバーヘッド制限を超えてしまいました。を超えると、アプリケーションがこのエラーでクラッシュします。

  • OutOfMemoryError: 要求された配列サイズが VM 制限を超えています- アプリケーションがヒープ サイズより大きい配列にメモリを割り当てようとしたことを示します。これもデフォルトのメモリ割り当てが不十分であることが原因である可能性があります。

  • OutOfMemoryError: Metaspace — ヒープでメタデータに割り当てられたスペースが不足しました (メタデータはクラスとメソッドの命令です)。

  • OutOfMemoryError: 理由によりサイズ バイトを要求しました。スワップ領域不足- ヒープからメモリを割り当てようとしたときに何らかの障害が発生し、その結果、ヒープにメモリが不足しました。

10. スタック トレースとは何ですか? 入手方法は?

スタック トレースは、アプリケーションのこの時点までに呼び出されたクラスとメソッドのリストです。次のように、アプリケーション内の特定のポイントでスタック トレースを呼び出すことができます。
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
このようにして、後入れ先出しの LIFO 順 に配置されたスタック トレース要素の配列を取得します。インタビューの質問と回答の分析。 パート 1 ~ 8Java では通常、スタック トレースとは、エラー (または例外) が発生したときにコンソールに表示されるスタック トレースを指します。次のように例外のスタック トレースを取得できます。
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
さて、コンソールでの例外スタック トレースの出力について話している場合は、次のようになります。
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
また、エラー、未チェック例外、またはチェック済み例外が発生した場合、これらは処理されず転送のみが行われ、アプリケーションがクラッシュすると、コンソールで例外のスタック トレースが自動的に受信されます。コンソールでのスタック トレース例外の小さな例:スタック トレースの詳細については、こちらをインタビューの質問と回答の分析。 パート 1 ~ 9参照してください。今日はこの問題に焦点を当てます...インタビューの質問と回答の分析。 パート 1 ~ 10
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION