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 8

Veröffentlicht in der Gruppe Random-DE
Praxis oder Theorie? Was ist wichtiger? Viele Leute werden natürlich sagen, dass Übung wichtiger ist. Üben Sie, bis die Sonne untergeht, und Sie werden glücklich sein. Ich werde es wagen, dem nicht zuzustimmen. Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 8 - 1Bei Vorstellungsgesprächen wird niemand erfahren, wie cool du beim Üben bist. Stattdessen werden Sie gebeten, Ihre theoretischen Fähigkeiten unter Beweis zu stellen. Erst später, wenn Sie alle Ebenen der Vorstellungsgespräche hinter sich gelassen haben und einem Projekt zugewiesen werden, können Sie Ihre praktischen Fähigkeiten anwenden. Sie könnten Einwände erheben und sagen, dass man Ihnen manchmal eine Testaufgabe gibt, sodass noch Übung nötig ist. Ich widerspreche nicht, aber mein Punkt ist, dass dies MANCHMAL so ist, Sie aber IMMER in einem Vorstellungsgespräch theoretische Kenntnisse nachweisen müssen. Spüren Sie den Unterschied? All dies bedeutet, dass Sie über ein solides theoretisches Fundament verfügen müssen, und das werden wir heute weiter ausbauen. Konkreter werden wir uns weiterhin mit Fragen befassen, die in Vorstellungsgesprächen häufig gestellt werden.

71. Was passiert, wenn wir die toString()-Methode von Enum nicht überschreiben?

Angenommen, wir haben die folgende Aufzählung :
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
Lassen Sie uns das Feld STUDENT auf der Konsole anzeigen, indem wir seine toString() -Methode aufrufen :
System.out.println(Role.STUDENT.toString());
Als Ergebnis erhalten wir die folgende Konsolenausgabe:
STUDENT
Wir sehen also, dass für eine Aufzählung die Standardimplementierung von toString() den Namen der Konstante selbst zurückgibt.

72. Können Sie einen Konstruktor innerhalb einer Enum deklarieren?

Ja natürlich. Der Konstruktor legt die Werte der internen Felder der Aufzählung fest. Als Beispiel fügen wir der vorherigen Enumeration zwei Felder hinzu ( ageFrom und ageTo ), um den Altersbereich für jede Rolle anzugeben:
public enum Role {
   STUDENT(5,18),
   TEACHER(20,60),
   DIRECTOR(40,70),
   SECURITY_GUARD(18,50);

   int ageFrom;
   int ageTo;

   Role(int ageFrom, int ageTo) {
       this.ageFrom = ageFrom;
       this.ageTo = ageTo;
   }
}

73. Was ist der Unterschied zwischen == und equal()?

Dies ist eine der häufigsten Interviewfragen, die angehenden Java-Entwicklern gestellt werden. Beim Vergleich einfacher Werte ( int , char , double ...) verwenden wir zunächst == , da diese Variablen konkrete Werte enthalten, die direkt verglichen werden können. Darüber hinaus sind primitive Variablen keine vollwertigen Objekte – sie erben nicht die Object- Klasse und verfügen nicht über eine equal()- Methode. Wenn wir über den Vergleich von Variablen sprechen, die auf Objekte verweisen, müssen wir wissen, dass == nur den Wert der Referenzen vergleicht, also ob sie sich auf dasselbe Objekt beziehen oder nicht. Selbst wenn alle Daten in einem Objekt mit allen Daten in einem anderen Objekt identisch sind, führt die Verwendung von == für einen Vergleich zu einem negativen Ergebnis ( false ), da es sich um separate Objekte handelt. Wie Sie vielleicht schon erraten haben, verwenden wir die Methode equal() , um Referenzvariablen zu vergleichen. Dies ist eine der Standardmethoden der Object- Klasse und für einen vollständigen Vergleich von Objekten erforderlich. Aber ich muss gleich sagen, dass diese Methode, damit sie richtig funktioniert, überschrieben werden muss, um genau anzugeben, wie die Objekte verglichen werden sollen. Wenn Sie die Methode nicht überschreiben, erhalten Sie die Standardimplementierung, die die Objekte mit == vergleicht . In IntelliJ IDEA können Sie es automatisch überschreiben, indem Sie eine IDEA-Verknüpfung verwenden: Alt+Einfügen . Wählen Sie im angezeigten Fenster equal() und hashCode() aus . Wählen Sie dann die Felder aus, die beteiligt sein sollen. Voila! Die Methoden werden automatisch implementiert. Hier ist ein Beispiel dafür, wie eine automatisch generierte equal- Methode nach der einfachsten möglichen Cat- Klasse mit zwei Feldern sucht – int age und String name :
@Override
public boolean equals(final Object o) {
   if (this == o) return true;
   if (o == null || this.getClass() != o.getClass()) return false;
   final Cat cat = (Cat) o;
   return this.age == cat.age &&
           Objects.equals(this.name, cat.name);
}
Wenn es um enum geht , gibt es keinen praktischen Unterschied zwischen == und equal() . Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 8 - 2Schließlich speichert eine Aufzählung Konstanten, und selbst wenn wir identische Werte mit == vergleichen , erhalten wir true , da die verglichenen Referenzen immer auf dieselben Objekte verweisen. Und auch die Verwendung von equal() liefert uns das richtige Ergebnis. Wenn Sie sich den Hauptteil der Methode equal für Enum ansehen , werden Sie sehen, dass die Enum- Klasse die folgende Implementierung hat: Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 8 - 3Im Inneren können wir einen guten alten Vergleich von Referenzen sehen! Zusammenfassend lässt sich sagen, dass wir für Enums einen korrekten Vergleich mit == und equal() durchführen können . Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 8 - 4

74. Was macht die ordinal()-Methode von Enum?

Wenn wir die Methode int ordinal() für ein Enumerationsfeld aufrufen , erhalten wir den nullbasierten Index des Feldes in der Liste der Enumerationswerte. Rufen wir diese Methode für ein Feld in der Rollenaufzählung auf, die wir zuvor betrachtet haben:
System.out.println(Role.DIRECTOR.ordinal());
Dementsprechend zeigt die Konsole Folgendes an:
2

75. Kann Enum mit TreeSet oder TreeMap in Java verwendet werden?

Wir können Aufzählungstypen in TreeSet und TreeMap verwenden . Und wir können Folgendes schreiben:
TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
Und die Konsole zeigt Folgendes an:
STUDENT LEHRER DIREKTOR SECURITY_GUARD
Wir haben die Ausgabe erhalten, jedoch nicht alphabetisch. Der Punkt ist, dass, wenn wir Aufzählungsfelder als TreeSet- Werte oder als TreeMap- Schlüssel verwenden, die Felder in ihrer natürlichen Reihenfolge sortiert werden (in der Reihenfolge, in der sie in der Aufzählung angegeben sind ). Wenn wir verstehen, dass es so funktioniert, können wir besseren Code schreiben.

76. Wie hängen die Methoden ordinal() und CompareTo() von Enum zusammen?

Wie bereits erwähnt, gibt ordinal() den Index eines Feldes in der Liste der Aufzählungsfelder zurück. Bei unserer Betrachtung der vorherigen Frage haben Sie außerdem gesehen, dass Enum-Felder, wenn sie in ein TreeSet (einen sortierten Satz) eingefügt werden, die Reihenfolge annehmen, in der sie im Enum deklariert sind . Und wie wir wissen, sortieren TreeSet und TreeMap Elemente, indem sie die Methode CompareTo() ihrer Comparable- Schnittstelle aufrufen. Dies sagt uns, dass die Enum- Klasse die Comparable- Schnittstelle implementiert, was bedeutet, dass sie die Methode „ compareTo()“ implementiert , die intern die Methode „ordinal()“ verwendet , um die Sortierreihenfolge zu bestimmen. Wenn wir uns der Klasse Enum widmen , können wir unsere Annahme bestätigen: Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 8 - 5Und hier ist der Hauptteil der Methode selbst: Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 8 - 6Die Methode ordinal() wird hier nicht aufgerufen. Stattdessen wird die Ordinalvariable verwendet, die die Indexnummer des Elements in der Aufzählung darstellt. Die ordinal()- Methode selbst Erkundung der Fragen und Antworten aus einem Vorstellungsgespräch für eine Stelle als Java-Entwickler.  Teil 8 - 7 ist nichts anderes als ein Getter für die Ordinalvariable .

77. Schreiben Sie ein Beispiel-Enum

In den oben besprochenen Fragen habe ich bereits Beispiele für Enumerationen angegeben . Ich sehe keinen Grund, hier Code zu duplizieren. Siehe beispielsweise Frage 72 bezüglich eines Konstruktors in einer Enumeration.

78. Kann ein Enum in einem Switch-Gehäuse verwendet werden?

Es kann und sollte sein! Wenn ich meine Erfahrung betrachte, werde ich feststellen, dass eine der häufigsten Verwendungen von enum in logischen Konstrukten wie switch- Anweisungen liegt. In diesem Fall können Sie alle möglichen case s angeben – sobald Sie die Logik für jedes Aufzählungsfeld geschrieben haben , benötigen Sie nicht einmal eine Standardklausel ! Wenn Sie schließlich einen String oder einen numerischen Wert wie z. B. int verwenden , erhalten Sie möglicherweise einen unerwarteten Wert, aber das ist mit einem enum nicht möglich . So würde eine switch- Anweisung für das obige Beispiel aussehen:
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // some logic for STUDENT
           break;
       case TEACHER:
           // some logic for TEACHER
           break;
       case DIRECTOR:
           // some logic for DIRECTOR
           break;
       case SECURITY_GUARD:
           // some logic for SECURITY_GUARD
           break;
   }
}

79. Wie erhalte ich alle möglichen Werte einer Enum?

Wenn Sie alle möglichen Aufzählungswerte abrufen müssen, gibt es die Methode „values()“ , die ein Array aller möglichen Werte für die Aufzählung in ihrer natürlichen Reihenfolge zurückgibt (d. h. in der Reihenfolge, in der sie in der Aufzählung angegeben sind ). Beispiel:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
Wir werden Folgendes auf der Konsole haben:
STUDENT LEHRER DIREKTOR SECURITY_GUARD

Stream-API

80. Was ist ein Stream in Java?

Die Java Stream API ist eine relativ neue Art der Interaktion mit einem Datenstrom, die es uns ermöglicht, große Datenmengen bequemer und kompakter zu verarbeiten sowie Daten parallel zwischen mehreren Streams zu verarbeiten, was möglicherweise die Leistung steigert.

81. Nennen Sie die Haupteigenschaften von Transaktionen

Das Thema hier ist die Stream-API, aber die Frage dreht sich um Transaktionen. Hmm... Lassen Sie uns zunächst verstehen, was eine Transaktion ist. Eine Transaktion ist eine Gruppe aufeinanderfolgender Vorgänge in einer Datenbank. Es stellt eine logische Arbeitseinheit dar. Eine Transaktion kann unabhängig von anderen gleichzeitigen Transaktionen entweder vollständig und erfolgreich ausgeführt werden, wodurch die Datenintegrität gewahrt bleibt, oder überhaupt nicht ausgeführt werden. In diesem Fall hat sie keine Auswirkungen. Transaktionen haben vier Haupteigenschaften, die wir uns dank des Akronyms ACID leicht merken können . Sehen wir uns an, was jeder Buchstabe dieses Akronyms bedeutet: A steht für Atomicity . Diese Eigenschaft garantiert, dass keine Transaktion teilweise im System festgeschrieben wird. Entweder werden alle Unteroperationen ausgeführt, oder keine davon ( alles oder nichts ). С steht für Konsistenz . Diese Eigenschaft garantiert, dass jede erfolgreiche Transaktion nur gültige Ergebnisse festschreibt. Mit anderen Worten: Dies ist eine Garantie dafür, dass bei erfolgreicher Transaktion alle Regeln des Systems für bestimmte Daten eingehalten werden. Wenn die Transaktion nicht erfolgreich ist, wird sie nicht ausgeführt und die Systemdaten kehren in ihren vorherigen Zustand zurück. I steht für Isolation . Diese Eigenschaft bedeutet, dass bei der Ausführung einer Transaktion gleichzeitige Transaktionen keinen Einfluss auf das Ergebnis haben dürfen. Diese Eigenschaft ist ressourcenintensiv und wird daher in der Regel teilweise implementiert, wodurch bestimmte Isolationsstufen ermöglicht werden, die bestimmte Isolationsprobleme lösen. Darauf gehen wir in der nächsten Frage genauer ein. D steht für Haltbarkeit . Diese Eigenschaft garantiert, dass der Benutzer, wenn er eine Bestätigung über den Abschluss der Transaktion erhält, sicher sein kann, dass die Änderungen nicht aufgrund eines Fehlers abgebrochen werden. Das heißt, Sie können sicher sein, dass ein Ausfall des Betriebssystems keine Auswirkungen auf Ihre Daten hat, wenn Sie bereits eine Bestätigung erhalten haben, dass Ihre Transaktion erfolgreich abgeschlossen wurde.

82. Was sind die Transaktionsisolationsstufen?

Wie ich bereits sagte, ist die Sicherstellung der Isolierung bei ACID-Eigenschaften ein ressourcenintensiver Prozess. Dementsprechend ist diese Eigenschaft teilweise umgesetzt. Es gibt verschiedene Stufen der Isolation: Je höher die Stufe, desto gravierender sind die Auswirkungen auf die Leistung. Bevor wir zu den Transaktionsisolationsstufen übergehen, müssen wir verschiedene Probleme berücksichtigen, die aufgrund unzureichender Transaktionsisolation auftreten :
  • Phantom liest : Wenn dieselbe Anforderung innerhalb einer einzelnen Transaktion mehr als einmal aufgerufen wird, aufgrund von Einfügungen durch eine andere Transaktion unterschiedliche Ergebnisse liefert;

  • Nicht wiederholbare Lesevorgänge : Wenn dieselbe Anforderung, die innerhalb einer einzelnen Transaktion mehr als einmal aufgerufen wird, aufgrund von Änderungen (Aktualisierungen) und Löschungen durch eine andere Transaktion unterschiedliche Daten liefert;

  • Dirty Reads : Lesen noch nicht festgeschriebener Daten, die durch eine Transaktion hinzugefügt oder geändert wurden und anschließend zurückgesetzt werden;

  • Verlorene Aktualisierungen : Wenn ein Datenblock gleichzeitig durch verschiedene Transaktionen geändert wird und alle Änderungen außer der letzten verloren gehen (ähnlich einer Race Condition beim Multithreading).

Tatsächlich sind Transaktionsisolationsstufen dadurch gekennzeichnet, vor welchen Isolationsproblemen sie schützen. Betrachten Sie die folgende Tabelle mit Isolationsstufen und den Problemen, vor denen sie schützen:
Isolationsstufe Phantom liest Nicht wiederholbare Lesevorgänge Schmutzige Lektüre Update verloren
SERIALISIERBAR + + + +
WIEDERHOLBARES LESEN - + + +
LESEN SIE ENGAGIERT - - + +
LESEN SIE UNVERPFLICHTET - - - +
KEINER - - - -
Und vergessen Sie nicht die Kehrseite: Je höher die Isolationsstufe, desto länger dauert die Verarbeitung von Transaktionen (bei paralleler Ausführung mehrerer Transaktionen).

83. Was ist der Unterschied zwischen einem Statement und einem PreparedStatement?

Hier haben wir abrupt auf die Funktionen von JDBC umgestellt . Lassen Sie uns auf jeden Fall zunächst herausfinden, worum es bei einer Erklärung geht. Es handelt sich um ein Objekt, das zum Erstellen von SQL-Abfragen verwendet wird. JDBC verwendet drei Arten: Statement , PreparedStatement und CallableStatement . Wir werden CallableStatement heute nicht berücksichtigen . Stattdessen sprechen wir über den Unterschied zwischen Statement und PreparedStatement .
  1. Die Anweisung wird verwendet, um einfache SQL-Abfragen ohne Laufzeiteingabeparameter auszuführen. PrepareStatement kann zur Laufzeit Eingabeparameter akzeptieren.

  2. Um Parameter für PreparedStatement festzulegen , werden Eingabeparameter als Fragezeichen in die Anfrage geschrieben, sodass sie mithilfe verschiedener Setter wie setDouble() , setFloat() , setInt() , setTime() ... durch einen Wert ersetzt werden können bedeutet, dass Sie nicht den falschen Datentyp in die Anfrage einfügen.

  3. PreparedStatement ist vorkompiliert und verwendet Caching, sodass es etwas schneller ausgeführt werden kann als eine Anforderung aus Statement- Objekten. Daher werden SQL-Anweisungen, die häufig ausgeführt werden, als PreparedStatement- Objekte erstellt, um die Leistung zu verbessern.

  4. Die Anweisung ist anfällig für SQL-Injection, aber PreparedStatement verhindert sie.

Und damit machen wir Feierabend!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION