JavaRush /Java-Blog /Random-DE /Analyse von Fragen und Antworten aus Interviews für Java-...

Analyse von Fragen und Antworten aus Interviews für Java-Entwickler. Teil 6

Veröffentlicht in der Gruppe Random-DE
Hallo Welt! Die Weiterentwicklung ist für jeden Entwickler sehr wichtig. Denn wenn man damit aufhört, besteht die Gefahr, dass man nicht mehr beansprucht wird und komplett vom Markt verschwindet: Die IT-Welt entwickelt sich ständig weiter und schreitet voran, und man muss mit ihr Schritt halten. Aber auch gleichzeitig kann man sich nicht nur auf neue und frische Technologien konzentrieren, um sozusagen die Klassiker (klassische Themen) nicht zu vergessen. Heute möchte ich meine Analyse von Fragen zu „klassischen“ Themen für einen Java-Entwickler fortsetzen. Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 6 - 1Ich stelle fest, dass meine Antworten nicht die endgültige Autorität darstellen – ich sehe nur so die richtigen Antworten auf diese Fragen, und Sie sind möglicherweise mit einigen davon nicht einverstanden. Das wird ganz normal sein, also teilen Sie uns Ihre Meinung gerne in den Kommentaren mit. Links zu Teilen der Analyse finden Sie am Ende des Artikels.Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 6 - 2

Bibliotheken und Standards

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

Ich denke, um diese Frage zu beantworten, müssen wir zunächst verstehen, was JPA ist . JPA ist eine Spezifikation, die die objektrelationale Zuordnung einfacher Java-Objekte beschreibt und eine API zum Speichern, Abrufen und Bearbeiten solcher Objekte bereitstellt. Das heißt, wie wir uns erinnern, werden relationale Datenbanken (DBs) in Form vieler miteinander verbundener Tabellen dargestellt. Und JPA ist ein weithin akzeptierter 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. Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 6 - 3Gleichzeitig ist Hibernate eine spezielle Bibliothek, die das JPA- Paradigma implementiert . Das heißt, mit Hilfe dieser Bibliothek können Sie mit einer relationalen Datenbank über Objekte arbeiten, die Daten aus der Datenbank (Entität) darstellen. Wie man sagt, kommt diese Bibliothek den Idealen von JPA sehr nahe und ist vielleicht deshalb so beliebt geworden. Und wie Sie wissen, ist die Beliebtheit der Nutzung ein gutes Argument für Weiterentwicklung und Verbesserungen. Darüber hinaus steckt hinter der häufigen Nutzung eine riesige Community, die bereits alle möglichen und unmöglichen Fragen rund um dieses Tool geklärt hat. Hier ist ein Beispiel für ein Buch , das alle dunklen Ecken dieser Technologie im Detail untersucht. Das heißt, Hibernate wurde so gut wie möglich untersucht und ist, wie sich herausstellt, zuverlässig. Tatsächlich ist es nicht umsonst, dass selbst die ideale Implementierung von JPA auf der Spring-Seite in der Regel Hibernate unter der Haube nutzt.

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

Wie ich bereits sagte, erfolgt die Kommunikation im Ruhezustand über Datenobjekte, die als Entitäten bezeichnet werden . Diese Entitäten repräsentieren bestimmte Tabellen in der Datenbank, und wie Sie sich erinnern, können Klassen in Java Verweise auf andere Klassen enthalten. Diese Beziehungen werden in der Datenbank widergespiegelt. In einer Datenbank sind dies in der Regel entweder Fremdschlüssel (für OneToOne, OneToMany, ManyToOne) oder Zwischentabellen (für ManyToMany). Mehr über die Beziehung zwischen Entitäten können Sie in diesem Artikel lesen . Wenn Ihre Entität über Links zu anderen verwandten Entitäten verfügt, werden über diesen Links Anmerkungen platziert, um die Art der Verbindung anzuzeigen: @OneToOne, @OneToMany, @ManyToOne, @ManyToMane, in deren Parametern Sie den Wert der Eigenschaft angeben können – Kaskade – die Art der Kaskade für diese Verbindung. JPA verfügt über spezielle Methoden für die Interaktion mit Entitäten (beibehalten, speichern, zusammenführen ...) . Kaskadierende Typen werden genau verwendet, um zu zeigen, wie sich die zugehörigen Daten verhalten sollen, wenn diese Methoden auf der Zielentität verwendet werden. Was sind also die Kaskadenstrategien (Kaskadenarten)? Der JPA-Standard impliziert die Verwendung von sechs Arten der Kaskadierung:
  • PERSIST – Speichervorgänge werden kaskadiert ausgeführt (für die Methoden save() und persist() ). Das heißt, wenn wir eine mit anderen Entitäten verknüpfte Entität speichern, werden diese auch in der Datenbank gespeichert (sofern sie nicht bereits vorhanden sind).

  • MERGE – Aktualisierungsvorgänge werden kaskadiert ausgeführt (für die Methode merge() )

  • REMOVE – Entfernungsvorgänge erfolgen kaskadiert ( remove()- Methode )

  • ALL – enthält drei Kaskadenoperationen gleichzeitig – PERSISTMERGEREMOVE

JPA hat das 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, die Änderungen aber nicht in der Datenbank speichern, werden seine Daten in der Datenbank trotzdem geändert.
  • DETACH – verwandte Entitäten werden nicht von der Sitzung verwaltet ( detach() -Methode ). Das heißt, wenn sie sich ändern, werden ihre Daten in der Datenbank nicht automatisch geändert – sie werden vom Persistenzstatus in den Status „getrennt“ (eine Entität, die nicht von JPA verwaltet wird) übertragen.

  • REFRESH – jedes Mal, wenn eine Entität mit Daten aus der Datenbank aktualisiert wird ( refresh() – aktualisiert getrennte Objekte), werden verwandte Entitäten auf die gleiche Weise aktualisiert. Sie haben beispielsweise die aus der Datenbank entnommenen Daten irgendwie geändert und möchten ihre ursprünglichen Werte zurückgeben. In diesem Fall wird dieser Vorgang für Sie nützlich sein.

Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 6 - 4Hibernate unterstützt alle diese Standardkaskadierungsvorgänge, führt aber auch drei eigene ein:
  • REPLICATE – Wird verwendet, wenn wir mehr als eine Datenquelle haben und die Daten synchronisiert werden sollen (Hibernate-Methode – Replizieren). Alle Entitäten müssen über Identifikatoren (ID) verfügen, damit es bei ihrer Generierung keine Probleme gibt (damit dieselbe Entität nicht unterschiedliche IDs für verschiedene Datenbanken hat).

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

  • LOCK ist die umgekehrte Operation zu DETACHED : Es versetzt die getrennte Entität zurück in den Persistenzzustand , d. h. Die Entität wird von der aktuellen Sitzung erneut verfolgt

Wenn der kaskadierende Typ nicht ausgewählt ist, hat keine Operation an einer Entität Auswirkungen auf andere damit verbundene Entitäten.

54. Kann eine Entity-Klasse abstrakt sein?

In der JPA-Spezifikation in Abschnitt 2.1 Die Entitätsklasse gibt es eine Zeile: „ Sowohl abstrakte als auch konkrete Klassen können Entitäten sein .“ Die Antwort lautet also: Ja, eine abstrakte Klasse kann eine Entität sein und mit @Entity annotiert werden.

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

Zunächst möchte ich darauf hinweisen, dass EntityManager eine der Schlüsselkomponenten von JPA ist , die zur Interaktion von Entitäten mit der Datenbank verwendet wird. Im Allgemeinen werden die Methoden der Interaktion zwischen der Entität und der Datenbank aufgerufen (beibehalten, zusammenführen, entfernen, trennen)... Ich möchte jedoch auch anmerken, dass diese Komponente in der Regel nicht für die gesamte Anwendung gilt: am häufigsten Es ist leichtgewichtig und wird häufig entfernt und mit EntityManagerFactory ein neues erstellt . Wenn wir eine Parallele zu JDBC ziehen , wo EntityManagerFactory ein Analogon von DataSource ist , dann ist EntityManager wiederum ein Analogon von Connection . Zuvor habe ich eine Persistenzentität als eine Entität erwähnt , die von der aktuellen Verbindung gesteuert wird. Also: Diese Entität wird genau 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. Weiter unten in der Abbildung können Sie den Lebenszyklus einer Entität sehen: Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 6 - 5EntityManager verwaltet die Entität, wenn sie sich in der verwalteten Phase befindet (zu diesem Zeitpunkt ist sie persistent, da sie eine Verbindung mit dem EntityManager hat). Das heißt, es ist nicht mehr neu und wurde noch nicht entfernt. Wir können sagen, dass, wenn eine Entität neu oder entfernt ist, sie auch abgetrennt wird, weil Es wird nicht vom EntityManager verwaltet. Es gibt verschiedene Strategien für EntityManager. Das heißt, es kann einen Singleton-EntityManager für die gesamte Anwendung geben oder es kann jedes Mal für jede Verbindung ein neuer erstellt werden. Wenn Sie Spring verwenden, wird das Erstellen/Löschen von EntityManager automatisch unter der Haube gesteuert (dies bedeutet jedoch nicht, dass Sie es nicht anpassen können ^^). Es ist erwähnenswert, dass ein oder mehrere EntityManager den Persistenzkontext bilden . Der 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, sehr oft auf diese Konzepte stoßen.

56. Was ist die Assert-Klasse? Warum es verwenden?

Ich habe noch nie von einer solchen Klasse in JPA gehört , daher gehe ich davon aus, dass es sich um die JUnit- Klasse der Bibliothek handelt, die für Unit-Tests von Code verwendet wird. Die Klasse dieser Bibliothek, Assert , wird verwendet, um die Ergebnisse der Codeausführung zu überprüfen ( assert ist eine Anweisung, dass Sie an einer bestimmten Stelle einen bestimmten Status/Daten haben). Sie testen beispielsweise eine Methode, die eine Katze erstellen soll. Sie führen eine Methode aus und erhalten ein Ergebnis:
Cat resultOfTest = createCat();
Aber Sie müssen sicherstellen, dass es korrekt erstellt wurde, oder? Daher haben Sie zuvor manuell eine bestimmte Katze – erwartete Katze – mit genau den Parametern erstellt, die Sie von der Katze erwarten, die Sie mit der Methode createCat() erhalten haben . Als Nächstes verwenden Sie die Assert- Klasse , um die Ergebnisse zu überprüfen:
Assert.assertEquals(resultOfTest, expectedCat);
Wenn die Katzen unterschiedlich sind, wird eine AssertionError- Ausnahme ausgelöst , die uns mitteilt, dass die erwarteten Ergebnisse nicht konvergieren. Die Assert- Klasse verfügt über viele verschiedene Methoden, die viele Aufgaben zur Überprüfung der erwarteten Ergebnisse abdecken. Hier sind einige davon:
  • affirmTrue(<boolean>) – der als Argument empfangene erwartete Wert muss wahr sein

  • affirmFalse(<boolean>) – der als Argument empfangene erwartete Wert sollte falsch sein

  • affirmNotEquals(<object1>, <object2>) – Als Argumente empfangene Objekte müssen beim Vergleich mit equal ( false ) unterschiedlich sein.

  • AssertThrows(<ClassNameOfException>.class, <ExceptionObject>) – Es wird erwartet, dass das zweite Argument eine Ausnahme der durch das erste Argument angegebenen Klasse ist (d. h. in der Regel wird anstelle des zweiten Arguments eine Methode aufgerufen, die ausgeführt werden sollte eine Ausnahme des erforderlichen Typs auslösen)

Zeichenfolge

57. Zeichenkette in Java charakterisieren

String ist eine Standardklasse in Java, die für das Speichern und Bearbeiten von String-Werten (Zeichenfolgen) verantwortlich ist. Es handelt sich um eine unveränderliche Klasse (ich habe zuvor über unveränderlich geschrieben ), d. h. Die Daten von Objekten dieser Klasse können nach der Erstellung nicht mehr geändert werden. Ich möchte sofort darauf hinweisen, dass es sich bei den Klassen StringBuilder und StringBuffer um zwei praktisch identische Klassen handelt, mit dem einzigen Unterschied, dass eine von ihnen für die Verwendung in einer Multithread-Umgebung gedacht ist (StringBuffer). Diese Klassen sind analog zu String , aber im Gegensatz dazu sind sie veränderbar . Das heißt, einmal erstellte Objekte ermöglichen die Änderung der von ihnen dargestellten Zeichenfolge, ohne dass ein neues Objekt erstellt werden muss. Tatsächlich unterscheiden sich die Methoden von den Standard- String -Methoden und zielen darauf ab, die Anforderungen zum Ändern des Strings zu erfüllen (nicht umsonst werden sie Builder genannt). Lesen Sie mehr über String , StringBuffer und StringBuilder in diesem Artikel .

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

Die gebräuchlichste Methode zum Erstellen einer Zeichenfolge besteht darin, einfach den benötigten Wert in doppelten Klammern anzugeben:
String str = "Hello World!";
Sie können dies auch direkt über new tun :
String str = new String("Hello World!");
Sie können eine Zeichenfolge ausgehend von einem Array von Zeichen erstellen:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
Als Ergebnis der Ausführung der toString- Methode für ein Objekt:
String str = someObject.toString();
Wie das Ergebnis jeder anderen Methode gibt sie eine Zeichenfolgendarstellung zurück. Zum Beispiel:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
Wie Sie wissen, gibt es sehr, sehr viele Möglichkeiten, eine Zeichenfolge zu erstellen. Wenn ein String- Objekt erstellt wird, wird es im String-Pool gespeichert , worüber wir in einer der folgenden Fragen ausführlicher sprechen werden.

59. Wie vergleiche ich zwei Zeichenfolgen in Java und wie sortiere ich sie?

Java verwendet das doppelte Gleichheitszeichen ==, um Werte zu vergleichen . Wenn wir einige einfache Werte wie int vergleichen müssten , würden wir es verwenden. Für den Vergleich vollwertiger Objekte ist diese Methode jedoch nicht anwendbar. In diesem Fall handelt es sich lediglich um einen Vergleich von Referenzen – unabhängig davon, ob diese auf dasselbe Objekt verweisen oder nicht. Das heißt, wenn zwei Objekte mit genau den gleichen Werten der internen Felder verglichen werden, führt der Vergleich über == zu einem falschen Ergebnis : Trotz der identischen Felder der Objekte belegen die Objekte selbst unterschiedliche Speicherzellen. Und Objekte der String- Klasse sind trotz ihrer trügerischen Einfachheit immer noch Objekte. Und der Vergleich über == ist für sie ebenfalls nicht anwendbar (auch trotz Vorhandensein eines String-Pools). Hier kommt die Standardmethode der Object- Klasse ins Spiel – equal , die in der Klasse überschrieben werden muss, damit sie korrekt funktioniert (andernfalls erfolgt der Vergleich standardmäßig mit == ). Es wird in der String- Klasse überschrieben , also nehmen wir es einfach und verwenden es:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 6 - 6Wir haben über Matching-Vergleiche gesprochen. Schauen wir uns nun Sortiervergleiche an. Um etwas zu sortieren, müssen wir schließlich wissen, nach welchem ​​Prinzip wir sortieren sollen. Dazu können Sie einen standardmäßig sortierten Satz verwenden – TreeSet . Weitere Informationen zu verschiedenen Sammlungen in Java finden Sie in diesem Artikel . Diese Liste basiert auf dem Rot-Schwarz-Baum-Algorithmus und sortiert die Menge nach dem angegebenen Sortierprinzip. Wie ich bereits sagte, müssen Sie verstehen, wie Objekte eines bestimmten Typs sortiert werden. Komparatoren werden verwendet, um die Vergleichsmethode für die Sortierung festzulegen . Normalerweise müssen diese für die Klassen implementiert werden, die Sie sortieren möchten, aber im Fall von String sind sie bereits implementiert. Deshalb fügen wir einfach die benötigten Zeilen zum TreeSet hinzu und es sortiert sie:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Konsolenausgabe:
A B C

60. Geben Sie einen Algorithmus zum Konvertieren einer Zeichenfolge in ein Zeichen an. Schreiben Sie den entsprechenden Code

Wie ich bereits sagte, verfügen Objekte der String- Klasse ü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, die wir per Index aufrufen können:
char firstChar = charArr[0]; // H

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

Ähnlich wie die toCharArray- Methode verfügt die String- Klasse über eine getBytes- Methode , die ein Byte-Array des Strings zurückgibt:
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Der heutige Teil der Analyse hat sein logisches Ende erreicht. Vielen Dank für Ihre Aufmerksamkeit!Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 6 - 7
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION