CodeGym /Java-Blog /Random-DE /Erkundung der Fragen und Antworten aus einem Vorstellungs...
John Squirrels
Level 41
San Francisco

Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler. Teil 6

Veröffentlicht in der Gruppe Random-DE
Hallo Welt! Für jeden Entwickler ist es wichtig, niemals mit dem Wachstum aufzuhören. Denn wer damit aufhört, riskiert, aus der Nachfrage zu geraten und ganz aus dem Arbeitsmarkt auszuscheiden. Die IT-Welt entwickelt sich ständig weiter und schreitet voran – Sie müssen mit ihr Schritt halten. Aber gleichzeitig kann man nicht immer die neuesten Technologien einsetzen, sonst vergisst man die „Klassiker“ (klassische Softwareentwicklungsthemen). Heute möchte ich meine Diskussion über „klassische Themen“ für Java-Entwickler fortsetzen. Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 6 - 1Ich möchte darauf hinweisen, dass meine Antworten nicht das letzte Wort sind. Es handelt sich dabei lediglich um die richtigen Antworten aus meiner Sicht. Möglicherweise sind Sie mit einigen davon nicht einverstanden. Das ist in Ordnung, also teilen Sie uns Ihre Meinung gerne in den Kommentaren mit. Links zu den vorherigen Teilen der Rezension finden Sie am Ende des Artikels. Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 6 - 2

Bibliotheken und Standards

52. Was ist Ruhezustand? Was ist der Unterschied zwischen JPA und Hibernate?

Um diese Frage zu beantworten, müssen wir meiner Meinung nach zunächst verstehen, was JPA ist. Dabei handelt es sich um eine Spezifikation, die eine objektrelationale Zuordnung einfacher Java-Objekte beschreibt und eine API zum Speichern, Abrufen und Bearbeiten solcher Objekte bereitstellt. Das heißt, relationale Datenbanken (DBs) werden als eine Reihe miteinander verbundener Tabellen dargestellt. Und JPA ist ein weit verbreiteter Standard, der beschreibt, wie Objekte mit relationalen Datenbanken interagieren können. Wie Sie sehen, ist JPA etwas Abstraktes und Immaterielles. Es ist wie die Idee selbst, der Ansatz. Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 6 - 3Aber Hibernate ist eine spezielle Bibliothek, die JPA-Paradigmen implementiert. Mit anderen Worten: Sie können diese Bibliothek verwenden, um mit einer relationalen Datenbank über Objekte zu arbeiten, die Daten in der Datenbank darstellen (Entität). Diese Bibliothek soll den JPA-Idealen sehr nahe kommen. Vielleicht wurde es deshalb populär. Wie Sie sich vorstellen können, rechtfertigte seine Popularität weitere Entwicklungen und Verbesserungen. Darüber hinaus ist die weit verbreitete Verwendung auf eine große Community zurückzuführen, die bereits alle möglichen und unmöglichen Fragen im Zusammenhang mit diesem Tool untersucht hat. Hibernate wurde gründlich untersucht und ist, wie sich herausstellt, zuverlässig. Es gibt einen guten Grund, warum selbst die ideale JPA-Implementierung im Frühjahr im Allgemeinen Hibernate unter der Haube verwendet.

53. Was ist Kaskadierung? Wie wird es im Ruhezustand verwendet?

Wie ich bereits sagte, erfolgt die Kommunikation im Ruhezustand über Datenobjekte, sogenannte Entitäten. Diese Entitäten repräsentieren bestimmte Tabellen in der Datenbank, und wie Sie sich erinnern, können Java-Klassen Verweise auf andere Klassen enthalten. Diese Beziehungen spiegeln sich auch in der Datenbank wider. In der Regel handelt es sich entweder um Fremdschlüssel (für OneToOne-, OneToMany-, ManyToOne-Beziehungen) oder um Zwischentabellen (für ManyToMany-Beziehungen). Wenn Ihre Entität Verweise auf andere verwandte Entitäten aufweist, werden über diesen Verweisen Anmerkungen platziert, um die Art der Beziehung anzugeben: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany. Sie können den Kaskadentyp für diese Beziehung in der Kaskadeneigenschaft der Anmerkungen angeben. JPA verfügt über spezifische Methoden für die Interaktion mit Entitäten (beibehalten, speichern, zusammenführen ...). Kaskadentypen werden verwendet, um zu zeigen, wie sich verwandte Daten verhalten sollen; Diese Methoden werden für eine Zielentität verwendet. Was sind also die Kaskadenstrategien (Kaskadentypen)? Der JPA-Standard sieht die Verwendung von sechs Kaskadentypen vor:
  • PERSIST – Speichervorgänge erfolgen in einer Kaskade (für die Methoden save() und persist() ). Mit anderen Worten: Wenn wir eine Entität speichern, die mit anderen Entitäten verknüpft ist, werden diese Entitäten auch in der Datenbank gespeichert (sofern sie nicht bereits vorhanden sind).

  • MERGE – Aktualisierungsvorgänge erfolgen in einer Kaskade (für die Methode merge() )

  • REMOVE – Löschvorgänge erfolgen in einer Kaskade ( remove()- Methode)

  • ALL – enthält drei kaskadierende Vorgänge gleichzeitig – PERSISTMERGEREMOVE

JPA basiert auf dem Konzept einer persistenten Entität – einer Entität, die mit ihren Daten in der Datenbank verknüpft ist und von der aktuellen Sitzung (Verbindung) gesteuert wird. Wenn Sie es ändern, ohne die Änderungen in der Datenbank zu speichern, werden die Daten der Entität in der Datenbank trotzdem geändert.
  • DETACH – verwandte Entitäten werden nicht von der Sitzung verwaltet ( detach() -Methode). Das heißt, wenn die Daten der zugehörigen Entitäten geändert werden, werden die Daten in der Datenbank nicht automatisch aktualisiert – sie werden von persistent in getrennt konvertiert (d. h. die Entität wird nicht von JPA verwaltet).

  • REFRESH – jedes Mal, wenn eine Entität mit Daten aus der Datenbank aktualisiert wird ( restart() – aktualisiert getrennte Objekte), werden auch die zugehörigen Entitäten aktualisiert. Sie haben beispielsweise die aus der Datenbank entnommenen Daten irgendwie geändert und möchten die ursprünglichen Werte wiederherstellen. In diesem Fall ist dieser Vorgang hilfreich.

Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 6 - 4Hibernate unterstützt alle diese Standardkaskadierungsvorgänge und führt außerdem drei eigene ein:
  • REPLICATE – wird verwendet, wenn wir mehr als eine Datenquelle haben und die Daten synchronisiert werden sollen (Replikationsmethode von Hibernate). Alle Entitäten müssen über Identifikatoren (ID) verfügen, um sicherzustellen, dass sie problemlos erstellt werden können (um sicherzustellen, dass dieselbe Entität nicht unterschiedliche IDs für verschiedene Datenbanken hat).

  • SAVE_UPDATE – kaskadierendes Speichern/Löschen (für die saveOrUpdate- Methode von Hibernate)

  • LOCK – das Gegenteil der DETACHED- Operation: Konvertiert eine getrennte Entität zurück in den dauerhaften Zustand, dh die aktuelle Sitzung verfolgt die Entität erneut

Wenn kein Kaskadentyp ausgewählt ist, hat eine Operation an der Entität keine Auswirkungen auf andere damit verbundene Entitäten.

54. Kann eine Entity-Klasse abstrakt sein?

Gemäß 2.1 Die Entitätsklasse der JPA-Spezifikationkönnen sowohl abstrakte als auch konkrete Klassen Entitäten sein. “ Die Antwort lautet also: Ja, eine abstrakte Klasse kann eine Entität sein und mit der Annotation @Entity markiert werden.

55. Was ist ein Entity Manager? Wofür ist es verantwortlich?

Zunächst möchte ich darauf hinweisen, dass EntityManager eine entscheidende Komponente von JPA ist . Es wird für die Interaktion von Entitäten mit der Datenbank verwendet. Im Allgemeinen werden Methoden für die Interaktion der Entität mit der Datenbank auf der Entität aufgerufen (Persist, Merge, Remove, Detach) ... Ich stelle jedoch auch fest, dass diese Komponente normalerweise kein Singleton für die gesamte Anwendung ist. Es ist oft leichtgewichtig, eines wird gelöscht und ein neues wird mit der EntityManagerFactory erstellt . Wenn wir eine Parallele zu JDBC ziehen , wo EntityManagerFactory analog zu DataSource ist , dann ist EntityManager analog zu Connection . Ich habe bereits erwähnt, dass eine persistente Entität eine Entität ist, die von der aktuellen Verbindung verwaltet wird. Diese Entität wird vom EntityManager verwaltet , der eng mit der aktuellen Verbindung verbunden ist, und vom TransactionManager , der für das Öffnen/Schließen von Transaktionen verantwortlich ist. In der folgenden Abbildung können Sie den Lebenszyklus der Entität sehen: Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 6 - 5Der EntityManager verwaltet die Entität, wenn sie sich in der verwalteten Phase befindet (wenn sie dauerhaft ist, da sie eine Verbindung mit dem EntityManager hat ). Das heißt, es ist nicht neu und wird auch nicht entfernt. Wenn eine Entität neu ist oder entfernt wird, können wir sagen, dass sie auch getrennt ist, da der EntityManager sie nicht verwaltet. Für den EntityManager gibt es unterschiedliche Strategien . Sie können einen EntityManager-Singleton für die gesamte Anwendung verwenden oder jedes Mal für jede Verbindung einen neuen erstellen. Wenn Sie Spring verwenden, wird das Erstellen/Löschen von EntityManager automatisch unter der Haube verwaltet (das bedeutet jedoch nicht, dass Sie es nicht selbst anpassen können ^^). Ich muss erwähnen, dass ein oder mehrere EntityManager einen Persistenzkontext bilden . Ein Persistenzkontext ist eine Umgebung, in der Instanzen von Entitäten mit ähnlichen Entitäten in der Datenbank synchronisiert werden (wie gesagt, dies funktioniert nur für persistente Entitäten). Wenn Sie sich tiefer mit JPA befassen (was ich wärmstens empfehle), werden Sie sehr oft auf dieses Konzept stoßen.

56. Was ist die Assert-Klasse? Warum wird es verwendet?

Ich habe noch nie von einer solchen Klasse in JPA gehört , daher gehe ich davon aus, dass sich diese Frage auf eine Klasse in der JUnit-Bibliothek bezieht, die für Komponententests verwendet wird. In dieser Bibliothek wird die Assert- Klasse verwendet, um die Ergebnisse der Codeausführung zu überprüfen (hier bedeutet „Assert“ eine Behauptung, dass Sie an einer bestimmten Stelle im Code über einen bestimmten Status/Daten verfügen). Nehmen wir zum Beispiel an, Sie testen eine Methode, die eine Katze erstellen soll. Sie führen die Methode aus und erhalten ein Ergebnis:
Cat resultOfTest = createCat();
Aber Sie müssen sicherstellen, dass es korrekt erstellt wurde, oder? Sie erstellen also manuell eine bestimmte Katze ( erwartete Katze ) mit genau den Parametern, die Sie in der Katze erwarten, die Sie mit der Methode createCat() erhalten haben . Anschließend verwenden Sie die Assert- Klasse, um die Ergebnisse zu überprüfen:
Assert.assertEquals(resultOfTest, expectedCat);
Wenn die Katzen unterschiedlich sind, wird ein AssertionError ausgelöst, der uns mitteilt, dass wir nicht die erwarteten Ergebnisse erhalten haben. Die Assert- Klasse verfügt über viele verschiedene Methoden, die eine Vielzahl von Vorgängen abdecken, die bei der Überprüfung erwarteter Ergebnisse hilfreich sind. Hier sind einige davon:
  • affirmTrue(<boolean>) – Es wird erwartet, dass der als Argument übergebene Wert wahr ist

  • behauptenFalse(<boolean>) – Der als Argument übergebene Wert wird voraussichtlich falsch sein

  • affirmNotEquals(<object1>, <object2>) – die als Argumente übergebenen Objekte müssen unterschiedlich sein, wenn sie mit „equals“ verglichen werden ( false )

  • behauptenThrows(<ClassNameOfException>.class, <ExceptionObject>) – Es wird erwartet, dass das zweite Argument eine vom ersten Argument ausgelöste Ausnahme ist (d. h. das zweite Argument ist normalerweise ein Methodenaufruf, der eine Ausnahme des erforderlichen Typs auslösen sollte)

Zeichenfolge

57. Beschreiben Sie die String-Klasse von Java

String ist eine Standard-Java-Klasse, die für das Speichern und Bearbeiten von String-Werten (Zeichenfolgen) verantwortlich ist. Es handelt sich um eine unveränderliche Klasse (über unveränderlich habe ich bereits hier geschrieben ), das heißt, die Daten von Objekten dieser Klasse können nach ihrer Erstellung nicht mehr geändert werden. Ich möchte sofort darauf hinweisen, dass die Klassen StringBuilder und StringBuffer im Wesentlichen identisch sind – der einzige Unterschied besteht darin, dass eine von ihnen für die Verwendung in einer Multithread-Umgebung ( StringBuffer ) vorgesehen ist. Diese Klassen ähneln String , unterscheiden sich jedoch darin, dass sie veränderbar sind . Selbst nachdem sie erstellt wurden, können Sie die von ihnen dargestellten Zeichenfolgen ändern, ohne ein neues Objekt erstellen zu müssen. Ihre Methoden unterscheiden sich von den Standard- String- Methoden und sind für die String-Manipulation konzipiert (es gibt einen Grund, warum sie sie als Builder bezeichnen).

58. Welche Möglichkeiten gibt es, ein String-Objekt zu erstellen? Wo entsteht es?

Die gebräuchlichste Methode zum Erstellen einer Zeichenfolge besteht darin, den gewünschten Wert einfach in doppelten Anführungszeichen anzugeben:
String str = "Hello World!";
Sie können dies auch explizit mit new tun :
String str = new String("Hello World!");
Sie können auch eine Zeichenfolge aus einem Array von Zeichen erstellen:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
Wir können dies tun, indem wir die toString -Methode für ein Objekt aufrufen :
String str = someObject.toString();
Wir können dies tun, indem wir jede andere Methode aufrufen, die einen String zurückgibt. Beispiel:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
Sie verstehen, dass es viele, viele Möglichkeiten gibt, eine Zeichenfolge zu erstellen. Wenn ein String- Objekt erstellt wird, wird es in einem String-Pool gespeichert , worauf wir in einer der folgenden Fragen näher eingehen.

59. Wie vergleicht man zwei Java-Strings und wie sortiert man sie?

Java verwendet ein doppeltes Gleichheitszeichen ( == ), um Vergleiche durchzuführen. Wenn wir einfache Werte wie Ganzzahlen vergleichen müssen, verwenden wir diese. Für den Vergleich vollwertiger Objekte ist diese Methode jedoch nicht geeignet. Es werden nur Referenzen verglichen, dh ob die Referenzen auf dasselbe Objekt verweisen oder nicht. Das heißt, wenn wir zwei Objekte mit den gleichen Feldwerten mit == vergleichen , erhalten wir false . Die Felder haben die gleichen Werte, aber die Objekte selbst belegen unterschiedliche Speicherorte. String- Objekte sind trotz ihrer trügerischen Einfachheit immer noch Objekte. Ein Vergleich mit == ist ebenfalls nicht angemessen (trotz des Vorhandenseins eines String-Pools). Die richtige Lösung ist die Standard- Equals- Methode der Object- Klasse , die überschrieben werden muss, damit sie ordnungsgemäß funktioniert (standardmäßig wird == für Vergleiche verwendet). Die String- Klasse überschreibt sie, daher verwenden wir einfach ihre Implementierung:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 6 - 6Wir haben über Gleichstellungsvergleiche gesprochen. Jetzt werden wir Vergleiche für die Sortierung finden. Denn wenn wir etwas sortieren wollen, müssen wir wissen, nach welchem ​​Prinzip wir sortieren. Dazu können Sie TreeSet verwenden , einen standardmäßig sortierten Satz. Diese Datenstruktur basiert auf dem Rot-Schwarz-Baum-Algorithmus und sortiert die Menge nach einem festgelegten Sortierprinzip. Wie ich bereits sagte, müssen Sie verstehen, wie Objekte eines bestimmten Typs sortiert werden. Um die Vergleichsmethode für die Sortierung zuzuweisen, verwenden Sie comparators . Normalerweise müssen Sie sie für Klassen implementieren, die Sie sortieren möchten, aber im Fall von String sind sie bereits implementiert. Dementsprechend fügen wir unsere Strings einfach zum TreeSet hinzu und es sortiert sie für uns:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Konsolenausgabe:
ABC

60. Stellen Sie einen Algorithmus zum Konvertieren einer Zeichenfolge in Zeichen bereit. Schreiben Sie den entsprechenden Code

Wie ich bereits sagte, verfügen String- Objekte über viele verschiedene nützliche Methoden. Eines davon ist toCharArray . Diese Methode wandelt einen String in ein Zeichenarray um:
String str = "Hello world";
char[] charArr = str.toCharArray();
Als nächstes haben wir ein Array von Zeichen, auf die wir per Index verweisen können:
char firstChar = charArr[0]; // H

61. Wie konvertiert man einen String in ein Byte-Array und zurück? Schreiben Sie den entsprechenden Code

Die String- Klasse verfügt über eine getBytes- Methode, die der toCharArray- Methode ähnelt und den String als Byte-Array zurückgibt:
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Wir sind heute zu dem logischen Ergebnis unserer Rezension gekommen. Danke fürs Lesen!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION