
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:
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() . 


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:
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:
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:


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:
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).
Isolationsstufe | Phantom liest | Nicht wiederholbare Lesevorgänge | Schmutzige Lektüre | Update verloren |
---|---|---|---|---|
SERIALISIERBAR | + | + | + | + |
WIEDERHOLBARES LESEN | - | + | + | + |
LESEN SIE ENGAGIERT | - | - | + | + |
LESEN SIE UNVERPFLICHTET | - | - | - | + |
KEINER | - | - | - | - |
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 .-
Die Anweisung wird verwendet, um einfache SQL-Abfragen ohne Laufzeiteingabeparameter auszuführen. PrepareStatement kann zur Laufzeit Eingabeparameter akzeptieren.
-
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.
-
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.
-
Die Anweisung ist anfällig für SQL-Injection, aber PreparedStatement verhindert sie.
GO TO FULL VERSION