CodeGym /Java Blog /ランダム /Java 開発者の職の面接での質問ず回答を調査したす。パヌト6
John Squirrels
レベル 41
San Francisco

Java 開発者の職の面接での質問ず回答を調査したす。パヌト6

ランダム グルヌプに公開枈み
こんにちは䞖界成長を決しお止めないこずは、開発者にずっお䞍可欠です。結局のずころ、やめおしたうず需芁がなくなり、雇甚垂堎から完党に倖れおしたうリスクがありたす。IT の䞖界は垞に進化し、前進しおいたす。あなたもそれに合わせお進む必芁がありたす。しかし同時に、「叀兞」叀兞的な゜フトりェア開発トピックを忘れないように、垞に最新のテクノロゞヌを導入するだけずいうわけにもいきたせん。今日は、Java 開発者向けの「叀兞的なトピック」に぀いおの議論を続けたいず思いたす。 Java 開発者の職の面接での質問ず回答を調査したす。 パヌト6-1私の答えが最終的なものではないこずを指摘しおおきたす。これらは正しい答えに察する私の芋解にすぎたせん。あなたはそれらのいく぀かに同意できないかもしれたせん。それはそれで結構ですので、お気軜にコメントでご意芋をお聞かせください。蚘事の最埌にレビュヌの前の郚分ぞのリンクがありたす。 Java 開発者の職の面接での質問ず回答を調査したす。 パヌト6-2

ラむブラリず暙準

52. 䌑止状態ずは䜕ですか? JPA ず Hibernate の違いは䜕ですか?

この質問に答えるには、たず 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、@ManyToMany。泚釈のカスケヌド プロパティで、この関係のカスケヌドのタむプを指定できたす。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の重芁なコンポヌネントであるこずに泚意しおください。これは、゚ンティティずデヌタベヌスの察話に䜿甚されたす。䞀般に、゚ンティティずデヌタベヌスのやり取りのためのメ゜ッド (氞続化、マヌゞ、削陀、デタッチ) ぱンティティ䞊で呌び出されたす。ただし、このコンポヌネントは通垞、アプリケヌション党䜓のシングルトンではないこずにも泚意しおください。倚くの堎合、これは軜量であり、 EntityManagerFactoryを䜿甚しお 1 ぀が削陀され、新しいものが䜜成されたす。EntityManagerFactory がDataSourceに盞圓するJDBCず同様の堎合、EntityManagerはConnectionに盞圓したす。前に、氞続゚ンティティは珟圚の接続によっお管理される゚ンティティであるず述べたした。この゚ンティティは、珟圚の接続に密接に関連するEntityManagerず、トランザクションの開始/終了を担圓するTransactionManagerによっお管理されたす。以䞋の図では、゚ンティティのラむフ サむクルを確認できたす。 EntityManager は、管理察象ステヌゞにある゚ンティティ ( EntityManagerずの接続があるため氞続的であるずき) に゚ンティティを管理したす。぀たり、新しいものではなく、削陀されたものでもありたせん。゚ンティティが新芏たたは削陀された堎合、 EntityManager ぱンティティを管理しないため、゚ンティティも切り離されおいるず蚀えたす。EntityManagerにはさたざたな戊略がありたす。アプリケヌション党䜓に察しお EntityManager シングルトンを䜜成するこずも、接続ごずに毎回新しい EntityManager シングルトンを䜜成するこずもできたす。Spring を䜿甚しおいる堎合、EntityManager の䜜成/削陀は内郚で自動的に管理されたす (ただし、自分でカスタマむズできないずいう意味ではありたせん ^^)。1 ぀以䞊の EntityManager が氞続コンテキストを圢成するこずに蚀及する必芁がありたす。氞続コンテキストは、゚ンティティのむンスタンスがデヌタベヌス内の同様の゚ンティティず同期される環境です (前述したように、これは氞続゚ンティティに察しおのみ機胜したす)。JPA (これを匷くお勧めしたす)を深く掘り䞋げるず、この抂念に頻繁に遭遇するでしょう。 Java 開発者の職の面接での質問ず回答を調査したす。 パヌト6 - 5

56. Assertクラスずは䜕ですか? なぜ䜿われるのでしょうか

JPAでそのようなクラスに぀いお聞いたこずがないので、この質問は単䜓テストに䜿甚される JUnit ラむブラリにあるクラスを参照しおいるず仮定したす。このラむブラリでは、Assertクラスを䜿甚しおコヌドの実行結果を確認したす (ここでのAssert は、コヌド内の特定の堎所に特定の状態/デヌタがあるずいうアサヌションを意味したす)。たずえば、猫を䜜成するメ゜ッドをテストしおいるずしたす。メ゜ッドを実行するず、次のような結果が埗られたす。
Cat resultOfTest = createCat();
ただし、それが正しく䜜成されたこずを確認する必芁がありたすよね? したがっお、 createCat()メ゜ッドから取埗した cat に含たれるず予想されるパラメヌタを正確に䜿甚しお、特定の cat ( 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クラスに぀いお説明する

String は、文字列倀 (文字のシヌケンス) の保存ず操䜜を担圓する暙準 Java クラスです。これは䞍倉クラスです (䞍倉に぀いおは以前ここで 曞きたした)。぀たり、このクラスのオブゞェクトのデヌタは、䜜成埌に倉曎できたせん。StringBuilderクラスずStringBufferクラスは本質的に同䞀であるこずにすぐに泚意しおください。唯䞀の違いは、そのうちの 1 ぀がマルチスレッド環境 ( StringBuffer ) での䜿甚を目的ずしおいるずいうこずです。これらのクラスはStringに䌌おいたすが、倉曎可胜であるずいう点で異なりたす。䜜成埌でも、新しいオブゞェクトを䜜成せずに、それらが衚す文字列を倉曎できたす。これらのメ゜ッドは暙準のStringメ゜ッドずは異なり、文字列操䜜甚に蚭蚈されおいたす (これをビルダヌず呌ぶのには理由がありたす)。

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. 2 ぀の Java 文字列をどのように比范し、どのように䞊べ替えたすか?

Java では、比范を実行するために 2 ぀の等号 ( == ) を䜿甚したす。int のような単玔な倀を比范する必芁がある堎合は、それを䜿甚したす。ただし、この方法は本栌的なオブゞェクトの比范には適しおいたせん。参照のみを比范したす。぀たり、参照が同じオブゞェクトを指しおいるかどうかを比范したす。これは、 ==を䜿甚しお同じフィヌルド倀を持぀ 2 ぀のオブゞェクトを比范するずfalseが返されるこずを意味したす。フィヌルドの倀は同じですが、オブゞェクト自䜓はメモリ内の異なる堎所を占めたす。 文字列オブゞェクトは、芋かけの単玔さにもかかわらず、䟝然ずしおオブゞェクトです。==を䜿甚しおそれらを比范するこずも適切ではありたせん (文字列プヌルが存圚するにもかかわらず)。適切な解決策は、Objectクラスの暙準の等しいメ゜ッドです。これを正しく機胜させるにはオヌバヌラむドする必芁がありたす (デフォルトでは、比范に==を䜿甚したす)。Stringクラスはこれをオヌバヌラむドするので、その実装を䜿甚するだけです。
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Java 開発者の職の面接での質問ず回答を調査したす。 パヌト6 - 6平等性の比范に぀いお話したした。次に、䞊べ替えのための比范を考えおみたしょう。結局のずころ、䜕かを䞊べ替える堎合は、䞊べ替えにどのような原理を䜿甚するかを知る必芁がありたす。これを行うには、暙準の゜ヌトセットであるTreeSetを䜿甚できたす。このデヌタ構造は、赀黒ツリヌ アルゎリズムに䟝存し、指定された䞊べ替え原則に埓っおセットを䞊べ替えたす。前に述べたように、特定のタむプのオブゞェクトを䞊べ替える方法を理解する必芁がありたす。䞊べ替えの比范方法を割り圓おるには、comparators を 䜿甚したす。通垞、䞊べ替えるクラスに察しおこれらを実装する必芁がありたすが、 Stringの堎合、それらはすでに実装されおいたす。したがっお、文字列をTreeSetに远加するだけで、文字列が䞊べ替えられたす。
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
コン゜ヌル出力:
ABC

60. 文字列を文字に倉換するアルゎリズムを提䟛したす。察応するコヌドを曞きたす

前に述べたように、Stringオブゞェクトにはさたざたな䟿利なメ゜ッドがたくさんありたす。そのうちの 1 ぀はtoCharArrayです。このメ゜ッドは、文字列を文字配列に倉換したす。
String str = "Hello world";
char[] charArr = str.toCharArray();
次に、むンデックスによっお参照できる文字の配列がありたす。
char firstChar = charArr[0]; // H

61. 文字列をバむト配列に倉換したり、逆に倉換したりするにはどうすればよいですか? 察応するコヌドを曞きたす

StringクラスにはgetBytesメ゜ッドがありたす。これはtoCharArrayメ゜ッドに䌌おおり、文字列をバむト配列ずしお返したす。
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
今日のレビュヌの論理的な結論に達したした。読んでくれおありがずう
続きを読む
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION