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

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

Random-JA グループに公開済み
こんにちは世界!開発を継続することは、開発者にとって非常に重要です。結局のところ、停止すると、要求されなくなり、完全に市場から消えてしまうリスクがあります。IT の世界は常に発展し、前進しており、それに合わせて前進する必要があります。しかし同時に、いわば古典(古典的な話題)を忘れないように、新しく新鮮なテクノロジーだけに焦点を当てることはできません。今日は、Java 開発者向けの「古典的な」トピックに関する質問の分析を続けたいと思います。 Java開発者へのインタビューからの質問と回答の分析。 パート6-1私の回答が最終的な権威ではないことに注意してください。これは、これらの質問に対する正しい答えを私がどのように見ているかにすぎず、中には同意できない場合もあります。これはごく普通のことなので、お気軽にコメントでご意見をお聞かせください。分析の一部へのリンクは記事の最後にあります。Java開発者へのインタビューからの質問と回答の分析。 パート6-2

ライブラリと標準

52. 休止状態とは何ですか? JPA と Hibernate の違いは何ですか?

この質問に答えるには、まずJPA とは何かを理解する必要があると思います。 JPAは、単純な Java オブジェクトのオブジェクト リレーショナル マッピングを記述し、そのようなオブジェクトを保存、取得、操作するための API を提供する仕様です。つまり、覚えているとおり、リレーショナルデータベース(DB) は、相互接続された多数のテーブルの形式で表現されます。JPA、オブジェクトがリレーショナル データベースと対話する方法を記述する、広く受け入れられている標準です。ご覧のとおり、JPA は抽象的で無形のものです。それはアイデアそのもの、アプローチのようなものです。Java開発者へのインタビューからの質問と回答の分析。 パート6-3同時に、Hibernate はJPAパラダイムを実装する特定のライブラリです。つまり、このライブラリを利用すると、データベース (エンティティ) のデータを表すオブジェクトを通じてリレーショナル データベースを操作できます。彼らが言うように、このライブラリはJPAの理想に非常に近いため、人気があるのか​​もしれません。ご理解のとおり、使用の人気は、さらなる開発と改善の良い根拠となります。さらに、頻繁に使用される背景には、このツールに関連する可能性と不可能性のすべての質問をすでに解決している巨大なコミュニティがあります。以下は、このテクノロジーのあらゆる暗い部分を詳細に調査した本の例です。つまり、Hibernate は可能な限り研究されており、信頼できることが判明しています。実際、Spring 側の JPA の理想的な実装でも、通常は内部で Hibernate が使用されるのは当然のことです。

53. カスケードとは何ですか? Hibernate ではどのように使用されますか?

前に述べたように、Hibernate では通信はエンティティと呼ばれるデータ オブジェクトを通じて実行されます。これらのエンティティはデータベース内のいくつかの特定のテーブルを表します。覚えているとおり、Java クラスには他のクラスへの参照を含めることができます。これらの関係はデータベースに反映されます。データベースでは、原則として、これらは外部キー (OneToOne、OneToMany、ManyToOne の場合) または中間テーブル (ManyToMany の場合) のいずれかです。エンティティ間の関係の詳細については、この記事を参照してください。エンティティに他の関連エンティティへのリンクがある場合、これらのリンクの上に注釈が配置され、接続のタイプを示します: @OneToOne、@OneToMany、@ManyToOne、@ManyToMane。これらのパラメータでは、プロパティ -カスケード-の値を指定できます。この接続のカスケードのタイプ。JPA には、エンティティと対話するための特定のメソッド (永続化、保存、マージなど) がありますカスケード型は、これらのメソッドがターゲット エンティティで使用されるときに、関連付けられたデータがどのように動作するかを示すために正確に使用されます。では、カスケード戦略 (カスケードの種類) とは何でしょうか? JPA 標準では、次の 6 種類のカスケードの使用が暗示されています。
  • PERSIST - 保存操作はカスケードで実行されます ( save()メソッドとpersist()メソッドの場合)。つまり、他のエンティティに関連付けられたエンティティを保存すると、それらもデータベースに保存されます (まだ存在しない場合)。

  • MERGE - 更新操作はカスケードで行われます ( merge()メソッドの場合)

  • REMOVE - 削除操作はカスケードで実行されます ( remove()メソッド)

  • ALL - 一度に 3 つのカスケード操作が含まれます - PERSIST - MERGE - REMOVE

JPAには、永続エンティティという概念があります。永続エンティティとは、データベース内のデータに関連付けられたエンティティであり、現在のセッション (接続) によって制御されます変更しても、その変更をデータベースに保存しなかった場合、データベース内のデータは変更されたままになります。
  • DETACH - 関連エンティティはセッション ( detach()メソッド) によって管理されません。つまり、変更されても、データベース内のデータは自動的に変更されません。永続状態からデタッチ状態 (JPA によって管理されないエンティティ) に転送されます。

  • REFRESH - エンティティがデータベースのデータで更新されるたびに ( refresh() - 切り離されたオブジェクトを更新します)、関連するエンティティも同じ方法で更新されます。たとえば、データベースから取得したデータを何らかの理由で変更し、その元の値を返したいとします。この場合、この操作が役に立ちます。

Java開発者へのインタビューからの質問と回答の分析。 パート6 - 4Hibernate はこれらの標準的なカスケード操作をすべてサポートしていますが、独自の 3 つの操作も導入しています。
  • REPLICATE - 複数のデータ ソースがあり、データを同期する必要がある場合に使用します (Hibernate メソッド - レプリケート)。すべてのエンティティは、生成に問題がないように (同じエンティティがデータベースごとに異なる ID を持たないように) 識別子 (id) を持っている必要があります。

  • SAVE_UPDATE - カスケード保存/削除 (Hibernate メソッドの場合 - saveOrUpdate )

  • LOCKはDETACHEDの逆の操作です。つまり、切り離されたエンティティを永続状態に戻します。エンティティは現在のセッションによって再び追跡されるようになります

カスケード タイプが選択されていない場合、エンティティに対する操作は、それに関連付けられている他のエンティティに影響を与えません。

54. Entityクラスは抽象クラスにできますか?

JPA 仕様のパラグラフ2.1 エンティティ クラスには、「抽象クラスと具象クラスの両方がエンティティになることができます。」という行があります。したがって、答えは「はい」です。抽象クラスはエンティティになることができ、@Entity の注釈を付けることができます。

55. エンティティマネージャーとは何ですか? 彼の責任は何ですか?

まず最初に、EntityManager はJPA の主要コンポーネントの 1 つであり、エンティティとデータベースのやり取りに使用されることに注意してください。一般に、エンティティとデータベース間の対話メソッド (永続化、マージ、削除、デタッチ) を呼び出します...ただし、このコンポーネントは、原則として、アプリケーション全体に対応するものではないことにも注意してください。これは軽量であり、頻繁に削除され、 EntityManagerFactoryを使用して新しいものが作成されます。EntityManagerFactory がDataSource に相当するJDBCと同様の場合、EntityManagerConnectionに相当します。先ほど、現在の接続によって制御されるエンティティとして永続エンティティについて説明しました。つまり、このエンティティは、現在の接続と密接に関連するEntityManagerと、トランザクションの開始/終了を担当するTransactionManagerによって正確に管理されます。さらに下の図では、エンティティのライフ サイクルを確認できます。EntityManagerは、管理対象ステージにあるエンティティを管理します (この時点では、EntityManager との接続があるため永続的です)。つまり、新しいものではなくなり、まだ削除されていません。エンティティが新規または削除されると、そのエンティティも切り離されると言えます。EntityManager によって管理されません。EntityManager にはさまざまな戦略があります。つまり、アプリケーション全体に対して 1 つのシングルトン EntityManager が存在することも、接続ごとに毎回新しい EntityManager が作成されることもあります。Spring を使用している場合、EntityManager の作成/削除は内部で自動的に制御されます (ただし、これはカスタマイズできないという意味ではありません ^^)。1 つ以上の EntityManager が永続コンテキストを形成すると言う価値があります。 永続コンテキストは、エンティティのインスタンスがデータベース内の同様のエンティティと同期される環境です (前述したように、これは永続エンティティに対してのみ機能します)。JPA (これを強くお勧めします)をさらに深く掘り下げると、これらの概念に非常に頻繁に遭遇するでしょう。Java開発者へのインタビューからの質問と回答の分析。 パート6 - 5

56. Assertクラスとは何ですか? なぜそれを使うのでしょうか?

JPAでそのようなクラスについて聞いたことがないので、これはコードの単体テストに使用されるライブラリのJUnitクラスを指すものと仮定します。このライブラリのクラスAssert は、コードの実行結果を確認するために使用されます ( assertは、特定の場所に特定の状態/データがあるというステートメントです)。たとえば、猫を作成するメソッドをテストしているとします。メソッドを実行すると、結果が得られます。
Cat resultOfTest = createCat();
ただし、それが正しく作成されたことを確認する必要がありますよね? したがって、以前に、createCat()メソッド から取得した猫から期待されるパラメータを正確に使用して、特定の猫 ( expectedCat)を手動で作成しました。次に、Assertクラスを使用して結果を確認します。
Assert.assertEquals(resultOfTest, expectedCat);
猫が異なる場合、AssertionError例外がスローされ、期待される結果が収束しないことがわかります。Assertクラスには、期待される結果を確認するタスクの多くをカバーするさまざまなメソッドが含まれています。その一部を次に示します。
  • assertTrue(<boolean>) - 引数として受け取る期待値はtrueである必要があります

  • assertFalse(<boolean>) - 引数として受け取る期待値はfalseである必要があります

  • assertNotEquals(<object1>, <object2>) - 引数として受け取ったオブジェクトは、equals を使用して比較する場合には異なる必要があります ( false )

  • assertThrows(<ClassNameOfException>.class, <ExceptionObject>) - 2 番目の引数は、最初の引数で指定されたクラスの例外であることが期待されます (つまり、原則として、2 番目の引数の代わりに、次のメソッドが呼び出されます)必要なタイプの例外をスローします)

57. Javaで文字列を特徴付ける

Stringは Java の標準クラスであり、文字列値 (文字のシーケンス) の保存と操作を担当し、不変クラスです (不変については以前に書きました)。このクラスのオブジェクトのデータは、作成後に変更することはできません。StringBuilder クラスStringBufferクラスは、実質的に同じ 2 つのクラスであり、唯一の違いは、そのうちの 1 つがマルチスレッド環境 (StringBuffer) での使用を目的としているということです。これらのクラスはStringに似ていますが、それとは異なり、変更可能です。つまり、オブジェクトを作成すると、新しいオブジェクトを作成しなくても、オブジェクトが表す文字列を変更できます。実際、このメソッドは標準のStringメソッドとは異なり、文字列を変更するニーズを満たすことを目的としています (ビルダーと呼ばれるのは当然のことです)。StringStringBuffer、およびStringBuilderの詳細については、この記事を参照してください。

58. String オブジェクトを作成するさまざまな方法には何がありますか? どこで作成されていますか?

文字列を作成する最も一般的な方法は、必要な値を二重括弧で囲んで指定することです。
String str = "Hello World!";
new を使用してこれを直接行うこともできます。
String str = new String("Hello World!");
文字の配列から始まる文字列を作成できます。
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
オブジェクト上で toStringメソッド が実行された結果:
String str = someObject.toString();
他のメソッドの結果と同様に、文字列表現を返します。例えば:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
ご存知のとおり、文字列を作成するには非常に多くの方法があります。Stringオブジェクトが作成されると、それはString poolに保存されます。これについては、以下の質問のいずれかで詳しく説明します。

59. Java で 2 つの文字列を比較し、並べ替えるにはどうすればよいですか?

Java では、値を比較するために 2 つの等号==を使用します。intのような単純な値を比較する必要がある場合は、それを使用します。ただし、この方法は本格的なオブジェクトの比較には適用できません。この場合、参照の比較は、それらが同じオブジェクトを指しているかどうかだけです。つまり、内部フィールドの値がまったく同じ 2 つのオブジェクトを比較する場合、==による比較では結果がfalseになります。オブジェクトのフィールドが同じであるにもかかわらず、オブジェクト自体は異なるメモリ セルを占有します。そして、Stringクラスのオブジェクトは、その一見単純さにもかかわらず、依然としてオブジェクトです。また、 ==による比較も (文字列プールが存在するにもかかわらず) それらには適用されません。ここでは、 Objectクラスの標準メソッド、equalsが機能します。これを正しく機能させるには、クラス内でオーバーライドする必要があります (そうでない場合、デフォルトでは==を使用して比較します)。これはStringクラスでオーバーライドされるので、それを取得して使用します。
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Java開発者へのインタビューからの質問と回答の分析。 パート6 - 6マッチング比較について説明しましたが、今度はソート比較を見てみましょう。結局のところ、何かを分類するには、どのような原則に従って分類するかを知る必要があります。これを行うには、標準のソートセット - TreeSetを使用できます。Java のさまざまなコレクションについて詳しくは、この記事をご覧ください。このリストは、赤黒ツリー アルゴリズムに基づいて機能し、指定された並べ替え原則に従ってセットを並べ替えます。前に述べたように、特定のタイプのオブジェクトを並べ替える方法を理解する必要があります。コンパレータは、並べ替えの比較方法を設定するために使用されます。通常、これらは並べ替えるクラスに対して実装する必要がありますが、 Stringの場合はすでに実装されています。したがって、必要な行をTreeSetに追加するだけで、それらが並べ替えられます。
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
コンソール出力:
A B C

60. 文字列を文字に変換するアルゴリズムを教えてください。適切なコードを書く

前に述べたように、Stringクラスのオブジェクトにはさまざまな便利なメソッドがたくさんあります。そのうちの 1 つはtoCharArrayです。このメソッドは、文字列を文字配列に変換します。
String str = "Hello world";
char[] charArr = str.toCharArray();
次に、インデックスによって呼び出すことができる文字の配列があります。
char firstChar = charArr[0]; // H

61. 文字列をバイト配列に変換したり、逆に変換したりするにはどうすればよいですか? 適切なコードを書く

toCharArrayメソッドと同様に、Stringクラスには文字列のバイト配列を返す getBytesメソッドがあります。
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
今日の分析部分は論理的な終わりに達しました。ご清聴ありがとうございました!Java開発者へのインタビューからの質問と回答の分析。 パート 6 ~ 7
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION