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 11

Veröffentlicht in der Gruppe Random-DE
Hallo! Selbst das schnellste Schiff ohne Kurs lässt sich einfach auf den Wellen treiben. Wenn Sie meinen Artikel jetzt lesen, haben Sie definitiv ein Ziel. Die Hauptsache ist, nicht in die Irre zu gehen, sondern Ihrer Linie bis zum Ende zu folgen – um Java-Entwickler zu werden. Heute möchte ich meine Analyse von über 250 Fragen für Java-Entwickler fortsetzen, die Ihnen dabei helfen werden, einige Lücken in der Theorie zu schließen. Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 11 - 1

97. Werden bei der Neudefinition von Equals Bedingungen für die Neudefinition von Vereinbarungen auferlegt?

Die überschriebene Methode equal() muss die folgenden Bedingungen (Regeln) erfüllen:
  • Reflexivität – für jeden Wert x sollte ein Ausdruck wie x.equals(x) immer true zurückgeben (wenn x != null ).

  • Symmetrie – für alle Werte von x und y muss ein Ausdruck der Form x.equals(y) nur dann true zurückgeben , wenn y.equals(x) true zurückgibt .

  • Transitivität – für alle Werte von x , y und z , wenn x.equals(y) true zurückgibt und y.equals(z) auch true zurückgibt , dann muss x.equals(z) true zurückgeben .

  • Konsistenz – für alle Werte von x und y gibt ein wiederholter Aufruf von x.equals(y) immer den Wert des vorherigen Aufrufs dieser Methode zurück, vorausgesetzt, dass sich die zum Vergleich der beiden Objekte verwendeten Felder zwischen den Aufrufen nicht geändert haben .

  • Vergleich null – für jeden Wert x gibt der Aufruf von x.equals(null) false zurück .

98. Was passiert, wenn Sie Equals und HashCode nicht überschreiben?

In diesem Fall gibt hashCode() eine Zahl zurück, die basierend auf dem Speicherort generiert wird, an dem das angegebene Objekt gespeichert ist. Das heißt, zwei Objekte mit genau den gleichen Feldern erhalten beim Aufruf eines nicht überschriebenen hashCode() unterschiedliche Werte (schließlich werden sie an unterschiedlichen Speicherorten gespeichert). Das nicht überschriebene equal() vergleicht Referenzen, um zu sehen, ob sie auf dasselbe Objekt verweisen oder nicht. Das heißt, der Vergleich erfolgt über == und bei Objekten mit denselben Feldern wird immer false zurückgegeben . „True“ ist nur dann vorhanden, wenn Referenzen auf dasselbe Objekt verglichen werden. Manchmal ist es logisch, diese Methoden nicht zu überschreiben. Sie möchten beispielsweise, dass alle Objekte einer bestimmten Klasse eindeutig sind, und das Überschreiben dieser Methoden würde nur die Logik der Einzigartigkeit beeinträchtigen. Die Hauptsache besteht darin, die Nuancen überschriebener und nicht überschriebener Methoden zu verstehen und je nach Situation beide Ansätze zu verwenden.

99. Warum ist Symmetrie nur dann wahr, wenn x.equals(y) wahr zurückgibt?

Eine etwas seltsame Frage. Wenn Objekt A gleich Objekt B ist, dann ist Objekt B gleich Objekt A. Wenn B nicht gleich Objekt A ist, wie ist dann das Gegenteil möglich? Das ist einfache Logik. Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 11 - 2

100. Was ist Kollision in HashCode? Wie man damit umgeht?

Eine HashCode- Kollision ist eine Situation, in der zwei verschiedene Objekte denselben HashCode- Wert haben . Wie ist das möglich? Tatsache ist, dass Hashcode dem Typ Integer zugeordnet ist , der wiederum einen Bereich von -2147483648 bis 2147483647 hat, also etwa 4 Milliarden verschiedene ganze Zahlen. Diese Bandbreite ist riesig, jedoch nicht unendlich. Daher sind Situationen möglich, in denen zwei völlig unterschiedliche Objekte denselben Hash-Code haben. Dies ist höchst unwahrscheinlich, aber möglich. Eine schlecht implementierte Hash-Funktion kann auch die Häufigkeit identischer Hash-Codes erhöhen, die beispielsweise Zahlen in einem kleinen Bereich zurückgeben, was die Wahrscheinlichkeit von Kollisionen erhöht. Um einer Kollision entgegenzuwirken, benötigen Sie eine gute Implementierung der hashCode- Methode , damit die Streuung der Werte maximal und die Wahrscheinlichkeit sich wiederholender Werte minimal ist.

101. Was passiert, wenn ein Element, das an einem HashCode-Vertrag teilnimmt, seinen Wert ändert?

Wenn ein Element, das an der Berechnung des Hash-Codes beteiligt ist, geändert wurde, wird auch der Hash-Code des Objekts selbst geändert (sofern die Hash-Funktion gut ist). Daher wird in HashMap empfohlen, unveränderliche (unveränderbare) Objekte als Schlüssel zu verwenden, da ihr interner Zustand (Felder) nach der Erstellung nicht geändert werden kann. Dementsprechend wird ihr Hashcode nach der Erstellung auch nicht konvertiert. Wenn Sie ein veränderliches Objekt als Schlüssel verwenden und die Felder dieses Objekts ändern, ändert sich sein Hash-Code und Sie können dieses Paar in der HashMap verlieren . Schließlich wird der ursprüngliche Hash-Code im Bucket gespeichert und nach der Änderung in einem anderen Bucket durchsucht. Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 11 - 3

102. Schreiben Sie die Methoden Equals und HashCode für die Student-Klasse, die aus den Feldern String name und int age besteht

public class Student {
int age;
String name;

 @Override
 public boolean equals(final Object o) {
   if (this == o) {
     return true;
   }
   if (o == null || this.getClass() != o.getClass()) {
     return false;
   }

   final Student student = (Student) o;

   if (this.age != student.age) {
     return false;
   }
   return this.name != null ? this.name.equals(student.name) : student.name == null;
 }

 @Override
 public int hashCode() {
   int result = this.age;
   result = 31 * result + (this.name != null ? this.name.hashCode() : 0);
   return result;
 }
}
Entspricht:
  • Zuerst vergleichen wir die Links direkt, denn wenn die Links auf dasselbe Objekt verweisen, welchen Sinn hat es dann, die Prüfung fortzusetzen? Alles wird sowieso wahr sein .

  • Überprüfung auf Null und auf übereinstimmende Klassentypen, denn wenn ein Objekt ein Argument von Null oder einem anderen Typ ist, bedeutet dies, dass die Objekte nicht gleich sind – false .

  • Umwandlung des Argumentobjekts in einen Typ (falls es ein Objekt des übergeordneten Typs war).

  • Vergleich eines Feldes einer primitiven Klasse (schließlich reicht dafür der Vergleich über =! ), wenn das Feld nicht gleich ist - false .

  • Beim Überprüfen eines nicht-primitiven Felds auf Null und Gleich (in String wird die Methode überschrieben und wird korrekt verglichen): Wenn beide Felder Null oder Gleich sind , endet die Prüfung und die Methode gibt true zurück .

Hash-Code:
  • Festlegen des anfänglichen Hash-Codewerts auf das Altersprimitiv des Objekts .

  • Multiplizieren des aktuellen Hash-Codes mit 31 (für eine größere Streuung) und Hinzufügen des Hash-Codes eines nicht-primitiven Zeichenfolgenfelds (sofern es nicht null ist).

  • Rückgabe des Ergebnisses.

  • Aufgrund dieser Hash-Code-Überschreibung geben Objekte mit demselben Namen und denselben Int- Werten immer denselben Wert zurück.

103. Was ist der Unterschied zwischen der Verwendung von if (obj instanceof Student) und if (getClass() == obj.getClass())?

Schauen wir uns an, was jeder Ansatz bewirkt:
  • Instanz von prüft, ob eine Objektreferenz auf der linken Seite eine Instanz eines Typs auf der rechten Seite oder ein Untertyp davon ist.

  • getClass() == ... prüft auf Typidentität.

Das heißt, wenn getClass() die vollständige Identität einer Klasse prüft, gibt „instanceof“ „true“ zurück , selbst wenn das Objekt nur ein Untertyp ist, was uns mehr Flexibilität bei der aktiven Verwendung von Polymorphismus geben kann. Tatsächlich sind beide Ansätze gut, wenn man die Besonderheiten ihrer Arbeit versteht und sie an den richtigen Stellen anwendet.

104. Geben Sie eine kurze Beschreibung der clone()-Methode.

Clone() ist eine Methode der Object- Klasse , deren Zweck darin besteht, einen Klon des aktuellen Objekts (eine Kopie des aktuellen Objekts) zu erstellen und zurückzugeben. Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 11 - 4Um es zu verwenden, müssen Sie die klonbare Markierungsschnittstelle implementieren :
Student implements Cloneable
Und überschreiben Sie die clone()- Methode selbst :
@Override
protected Object clone() throws CloneNotSupportedException {
 return super.clone();
}
Schließlich ist es in der Object- Klasse geschützt, das heißt, es ist nur in der Student- Klasse selbst sichtbar , für Klassen von außen jedoch nicht.

105. Was ist die Besonderheit der Methode clone(), die mit den Feldern eines Objekts vom Referenztyp arbeitet?

Beim Klonen von Objekten werden nur Grundwerte und der Wert von Objektreferenzen kopiert. Das heißt, wenn ein Objekt in seinem internen Feld einen Link zu einem anderen Objekt hat, wird nur dieser Link geklont, dieses andere Objekt selbst jedoch nicht. Tatsächlich wird dies als Oberflächenklonen bezeichnet. Was ist, wenn Sie ein vollständiges Klonen mit Klonen aller verschachtelten Objekte benötigen? Wie kann sichergestellt werden, dass es sich nicht um Kopien von Links handelt, sondern um vollwertige Klone von Objekten mit anderen belegten Speicherzellen im Heap? Tatsächlich ist alles ganz einfach – dazu müssen Sie auch die Methode clone() in jeder Klasse dieser internen Objekte überschreiben und eine Markierungsschnittstelle hinzufügen – Cloneable . Dann werden nicht die Verweise auf Objekte kopiert, sondern die Objekte selbst, denn nun haben sie auch die Fähigkeit, sich selbst zu kopieren.

Ausnahmen

106. Was ist der Unterschied zwischen Fehler und Ausnahme?

Sowohl Ausnahmen als auch Fehler sind Unterklassen der Throwable- Klasse . Sie haben jedoch ihre Unterschiede. Der Fehler weist auf ein Problem hin, das hauptsächlich aufgrund unzureichender Systemressourcen auftritt. Und unsere Anwendung sollte solche Probleme nicht erkennen. Beispiele für Fehler sind Systemabstürze und Fehler wegen unzureichendem Arbeitsspeicher. Fehler treten meist zur Laufzeit auf, da es sich um einen ungeprüften Typ handelt. Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 11 - 5Ausnahmen sind Probleme, die zur Laufzeit und zur Kompilierungszeit auftreten können. Normalerweise geschieht dies in Code, der von Entwicklern geschrieben wird. Das heißt, Ausnahmen sind vorhersehbarer und hängen stärker von uns als Entwicklern ab. Gleichzeitig sind Fehler eher zufällig und unabhängiger von uns, sondern hängen vielmehr von Problemen mit dem System selbst ab, in dem unsere Anwendung läuft.

107. Was ist der Unterschied zwischen aktiviert und nicht aktiviert, Ausnahme, Wurf, Würfe?

Wie ich bereits sagte, ist eine Ausnahme ein Fehler während der Programmausführung und während der Kompilierung, der im vom Entwickler geschriebenen Code aufgetreten ist (aufgrund einer abnormalen Situation). Checked ist ein Ausnahmetyp, der immer mit dem Try-Catch- Mechanismus behandelt oder in die oben genannten Methoden geworfen werden muss. Throws wird im Methodenheader verwendet, um mögliche von der Methode ausgelöste Ausnahmen anzuzeigen. Das heißt, dies ist der Mechanismus zum „Auswerfen“ von Ausnahmen in die oben genannten Methoden. „Unchecked“ ist ein Ausnahmetyp, der nicht behandelt werden muss und normalerweise weniger vorhersehbar ist und weniger wahrscheinlich auftritt. Sie können jedoch auf Wunsch auch bearbeitet werden. Throw wird verwendet, wenn eine Ausnahme manuell ausgelöst wird, zum Beispiel:
throw new Exception();

108. Wie ist die Hierarchie der Ausnahmen?

Die Hierarchie der Ausnahmen ist sehr groß und umfangreich, sogar zu umfangreich, um hier alles darüber zu erzählen. Daher betrachten wir nur die wichtigsten Verknüpfungen: Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 11 - 6Hier ganz oben in der Hierarchie sehen wir die Klasse – Throwable – eine allgemeine Klasse, den Vorfahren der Ausnahmehierarchie, die wiederum unterteilt ist in:
  • Fehler – kritische, nicht überprüfbare Fehler.
  • Ausnahme – geprüfte Ausnahmen.
Die Ausnahme ist in verschiedene ungeprüfte Laufzeitausnahmen und verschiedene geprüfte Ausnahmen unterteilt.

109. Was ist eine aktivierte und nicht aktivierte Ausnahme?

Wie ich bereits gesagt habe:
  • Aktiviert – Ausnahmen, die Sie irgendwie behandeln müssen, d. h. sie entweder in einem try-catch- Block verarbeiten oder an die obige Methode „weiterleiten“. Dazu müssen Sie in der Methodensignatur nach dem Auflisten der Methodenargumente das Schlüsselwort trows <Ausnahmetyp> verwenden , das Benutzern der Methode anzeigt, dass die Methode diese Ausnahme auslösen kann (so etwas wie eine Warnung) und die übermittelt Die Verantwortung für die Behandlung der Ausnahme liegt bei den Benutzern dieser Methode.

  • Ungeprüft – Ausnahmen, die nicht behandelt werden müssen, da sie zur Kompilierzeit nicht geprüft werden und in der Regel unvorhersehbarer sind. Das heißt, der Hauptunterschied zu Checked besteht darin, dass diese Try-Catch- oder Wurfmechanismen bei ihnen gleich funktionieren, aber nicht obligatorisch sind.

101. Schreiben Sie ein Beispiel für das Abfangen und Behandeln einer Ausnahme in einem Try-Catch-Block einer Methode

try{                                                 // начало блока перехвата
 throw new Exception();                             // ручной бросок исключения
} catch (Exception e) {                              // данное исключение и его потомки будут перехватываться
 System.out.println("Упс, что-то пошло не так =("); // вывод некоторого исключения в консоль
}

102. Schreiben Sie ein Beispiel für das Abfangen und Behandeln einer Ausnahme mithilfe Ihrer eigenen Ausnahmen

Schreiben wir zunächst unsere eigene Ausnahmeklasse, die von Exception erbt und ihren Konstruktor mit einer Fehlermeldung überschreibt:
public class CustomException extends Exception {

 public CustomException(final String message) {
   super(message);
 }
}
Nun, dann werfen wir es manuell und fangen es ab, wie in der vorherigen Frage:
try{
 throw new CustomException("Упс, что-то пошло не так =(");
} catch (CustomException e) {
 System.out.println(e.getMessage());
}
Und wenn Sie es erneut ausführen, erhalten Sie die folgende Ausgabe auf der Konsole:
Ups, da ist etwas schiefgelaufen =(
Analyse von Fragen und Antworten aus Interviews für Java-Entwickler.  Teil 11 - 7Mehr zu den Ausnahmen erfahren Sie hier . Nun, das ist alles für heute! Wir sehen uns im nächsten Teil!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION