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 1

Veröffentlicht in der Gruppe Random-DE
Hallo! Bei JavaRush versammelten sich verschiedene Menschen. Einige von uns wollen einfach nur Java-Entwickler werden und investieren viel Zeit und Mühe in die Entwicklung, während andere bereits Java-Entwickler sind. In dem einen oder anderen Fall müssen Sie auf Tests vorbereitet sein – technische Interviews. Dieser Test ist nicht einfach und neben der moralischen Vorbereitung ist auch eine technische Vorbereitung erforderlich. Analyse von Interviewfragen und -antworten.  Teil 1 - 1Kürzlich bin ich auf dou auf eine große Liste mit Fragen zu Vorstellungsgesprächen für Java-Entwickler gestoßen. Diese Fragen sind in verschiedene Stufen unterteilt – Junior, Middle und Senior. Seien Sie nicht beunruhigt: Nicht alle Fragen sind einfach, aber die mit einem Sternchen versehenen werden selten gestellt. Fragen sind gut, aber ich möchte versuchen, die meisten davon zu beantworten. Es ist klar, dass ich nicht auf einen einzelnen Artikel eingehen werde, schließlich gibt es dort viele Fragen. Daher wird dies eine ganze Reihe von Artikeln sein, die solche Fragen beantworten. Lassen Sie mich gleich ein paar Punkte hervorheben:
  1. Es gibt einen ausgezeichneten Artikel mit den wichtigsten Fragen und Antworten dazu. Einige Fragen überschneiden sich mit der oben dargestellten Liste (250+), daher werden diese Fragen übersprungen, um nicht noch einmal Informationen zu duplizieren.

  2. Die Fragen werden auf Ukrainisch gestellt, aber da die Mehrheit der JavaRush-Teilnehmer Russisch spricht (und in größerem Maße auch ich), werden die Antworten auf Russisch erfolgen.

  3. Die Antworten werden kurz sein, da die Antworten auf einige Fragen möglicherweise einen separaten Artikel erfordern, wenn Sie sehr detailliert schreiben. Und bei Vorstellungsgesprächen sind derart detaillierte und umfangreiche Antworten nicht erforderlich, da Ihr Interviewer nur eine Stunde Zeit hat, Sie zu den erforderlichen Themen zu befragen (und das ist, wie Sie sich erinnern, ausreichend). Für diejenigen, die tiefer in die Materie eintauchen möchten, werde ich Links hinterlassen.

Also, fangen wir an.

Fragen und Antworten für Junioren

Analyse von Interviewfragen und -antworten.  Teil 1 - 2

Allgemeine Probleme

1. Welche Designmuster kennen Sie? Erzählen Sie uns von den beiden Vorlagen, die Sie bei Ihrer Arbeit verwendet haben.

Es gibt eine große Vielfalt an Vorlagen: Sie können sich in diesem und diesem Artikel mit ihnen vertraut machen . Nun, denjenigen unter Ihnen, die sich im Detail damit vertraut machen möchten, empfehle ich die Lektüre des Buches „Head First. Designmuster" . Mit seiner Hilfe können Sie die grundlegendsten Designmuster detailliert und auf einfache Weise studieren. Wenn es um Designmuster geht, die Sie in einem Vorstellungsgespräch als Beispiele verwenden können, fallen mir einige ein:
  • Builder ist eine häufig verwendete Vorlage, eine Alternative zur klassischen Objekterstellung;
  • Strategiemuster , das von Natur aus Polymorphismus darstellt. Das heißt, wir haben eine Schnittstelle, aber das Verhalten des Programms ändert sich je nachdem, welche spezifische Implementierung dieser Schnittstelle in die Funktionalität übertragen wurde (heute wird die Strategie praktisch überall in Java-Anwendungen verwendet).
Wenn Ihnen das nicht ausreicht, achten Sie auf Spring (falls Sie bereits damit vertraut sind), denn es handelt sich um eine ganze Plattform von Frameworks, die wiederum nach oben und unten mit Mustern durchsetzt sind. Hier sind ein paar Beispiele dafür, wovon ich spreche:
  • Factory – im ApplicationContext (oder in der BeanFactory);
  • Singleton – alle Beans sind standardmäßig Singletons;
  • Proxy – im Wesentlichen verwendet alles in Spring dieses Muster auf die eine oder andere Weise, zum Beispiel AOP;
  • Die Verantwortungskette ist ein Muster, das auf dem Konzept von Spring Security basiert.
  • Vorlage – wird in Spring JDBC verwendet.

Java Core

Analyse von Interviewfragen und -antworten.  Teil 1 - 3

2. Welche Datentypen gibt es in Java?

Java hat primitive Datentypen:
  • Byte – Ganzzahlen im Bereich von -128 bis 127, wiegt 1 Byte;
  • short – ganze Zahlen im Bereich von -32768 bis 32767, wiegt 2 Bytes;
  • int – ganze Zahlen -2147483648 bis 2147483647, wiegt 4 Bytes;
  • long – ganze Zahlen im Bereich 9223372036854775808 bis 9223372036854775807, wiegt 8 Bytes;
  • float – Gleitkommazahlen im Bereich -3.4E+38 bis 3.4E+38, wiegt 4 Bytes;
  • double – Gleitkommazahlen im Bereich -1,7E+308 bis 1,7E+308, wiegt 8 Bytes;
  • char – einzelne Zeichen in UTF-16, wiegt 2 Bytes;
  • boolesche Werte wahr/falsch , wiegt 1 Byte.
Und Referenzdatentypen , die auf Objekte auf dem Heap verweisen.

3. Wie unterscheidet sich ein Objekt von primitiven Datentypen?

Der erste Unterschied: die Menge des belegten Speichers: Primitive beanspruchen sehr wenig, da sie nur ihren eigenen Wert enthalten, während Objekte sehr, sehr viele verschiedene Werte enthalten können: sowohl Primitive als auch Verweise auf andere Objekte. Der zweite Unterschied: Java ist eine objektorientierte Sprache, daher funktioniert alles darin über die Interaktion zwischen Objekten, und Grundelemente passen nicht sehr gut hinein (tatsächlich ist Java aus diesem Grund keine 100 % objektorientierte Sprache). Drittens, im Anschluss an das Zweite: Da sich Java auf die Interaktion zwischen Objekten konzentriert, verfügen diese Objekte über viele verschiedene Mechanismen zu ihrer Verwaltung. Zum Beispiel Konstruktoren, Methoden, Ausnahmen (die hauptsächlich auf Objekten wirken) usw. Damit Primitive irgendwie in dieser objektorientierten Umgebung involviert werden (funktionieren) können, wurden Wrapper für Primitivtypen erfunden ( Integer , Character , Double , Boolean ...).

4. Was ist der Unterschied zwischen der Übergabe von Parametern per Referenz und per Wert?

Primitive Felder speichern ihren Wert: Wenn wir beispielsweise int i = 9; Feld i speichert den Wert 9 . Wenn wir einen Verweis auf ein Objekt haben, bedeutet das, dass wir ein Feld mit einem Verweis auf das Objekt haben, oder anders ausgedrückt, mit dem Wert der Adresse des Objekts im Speicher.
Cat cat = new Cat();
Es stellt sich heraus, dass Felder mit einem Verweis auf ein Objekt auch Werte , Speicheradressenwerte, speichern. Das heißt, cat speichert den Adresswert des neuen Cat()- Objekts im Speicher. Wenn wir einen Parameter an eine Methode übergeben, wird sein Wert kopiert. Im Falle eines Primitivs wird der Wert des Primitivs kopiert. Dementsprechend funktioniert die Methode mit einer Kopie, deren Änderung keine Auswirkungen auf das Original hat. Im Falle eines Referenztyps wird der Wert der Speicheradresse kopiert bzw. die Adresse ist mit dem Objekt identisch, auf das sie zeigt. Und wenn wir das Objekt über diesen neuen Link ändern, wird es durch das alte ersetzt (schließlich verweisen beide auf dasselbe Objekt).

5. Was ist JVM, JDK, JRE?

JVM – Java Virtual Machine ist eine virtuelle Maschine, die vom Compiler vorgenerierten Java-Bytecode ausführt. JRE – Java Runtime Environment – ​​ist im Wesentlichen eine Umgebung zum Ausführen von Java-Anwendungen, die die JVM , Standardbibliotheken und andere Komponenten zum Ausführen von Applets und Anwendungen enthält, die in der Programmiersprache Java geschrieben sind. Mit anderen Worten : Die JRE ist ein Paket mit allem, was zum Ausführen eines kompilierten Java-Programms erforderlich ist, enthält jedoch keine Tools und Dienstprogramme wie Compiler oder Debugger für die Anwendungsentwicklung. JDK – Java Development Kit – ein erweiterter Satz von JRE , also eine Umgebung nicht nur zum Starten, sondern auch zum Entwickeln von Java-Anwendungen. Das JDK enthält alles, was in der JRE enthalten ist, sowie verschiedene zusätzliche Tools – Compiler und Debugger, die zum Erstellen von Anwendungen in Java erforderlich sind (enthält außerdem Java-Dokumente).Analyse von Interviewfragen und -antworten.  Teil 1 - 4

6. Warum JVM verwenden?

Wie oben erwähnt, ist Java Virtual Machine eine virtuelle Maschine, die vom Compiler vorgenerierten Java-Bytecode ausführt. Das heißt, die JVM versteht den Java-Quellcode nicht. Daher werden zunächst .java- Dateien kompiliert , die nach der Kompilierung bereits die Erweiterung .class haben und in Form desselben Bytecodes dargestellt werden, den die JVM versteht. Jedes Betriebssystem verfügt über eine eigene JVM. Nachdem die JVM die Bytecode-Dateien erhalten hat, führt sie diese aus und passt sie an das Betriebssystem an, auf dem sie ausgeführt wird. Tatsächlich unterscheiden sich die JDK- (oder JRE-)Versionen aufgrund unterschiedlicher JVMs für verschiedene Betriebssysteme (jedes erfordert eine eigene JVM). Erinnern wir uns daran, wie die Entwicklung in anderen Programmiersprachen funktioniert. Sie entwickeln ein Programm, dann wird sein Code in Maschinencode für ein bestimmtes Betriebssystem kompiliert und Sie können es dann ausführen. Mit anderen Worten: Sie müssen für jedes System unterschiedliche Versionen des Programms schreiben. Während Sie in Java dank der dualen Codeverarbeitung (Kompilierung und Verarbeitung von JVM-Codebytes) die Vorteile der plattformübergreifenden Nutzung genießen können. Wir haben den Code einmal erstellt, ihn erneut in Bytecode kompiliert, ihn auf ein beliebiges Betriebssystem übertragen und die lokale JVM führt den Code aus. Dies ist die legendäre Eigenschaft von Java – einmal schreiben, überall ausführen . Analyse von Interviewfragen und -antworten.  Teil 1 - 5Lesen Sie mehr dazu im Artikel „ Kompilieren und Ausführen von Java-Anwendungen unter der Haube “.

7. Was ist Bytecode?

Wie ich oben sagte, konvertiert der Compiler Java-Code in Zwischenbytecode ( Dateien mit der Erweiterung .java in Dateien mit der Erweiterung .class). Bytecode ähnelt in vielerlei Hinsicht dem Maschinencode, verwendet jedoch eine Reihe von Anweisungen nicht von einem realen, sondern von einem virtuellen Prozessor. Darüber hinaus kann es Abschnitte enthalten, die sich auf die Verwendung eines JIT-Compilers konzentrieren, der die Ausführung von Befehlen für den realen Prozessor optimiert, auf dem das Programm ausgeführt wird. Die JIT-Kompilierung, auch On-the-Fly-Kompilierung genannt, ist eine Technologie, die die Leistung eines Programms mithilfe von Bytecode steigert, indem der Bytecode während der Ausführung des Programms in eine Maschine oder ein anderes Format kompiliert wird. Wie Sie vielleicht schon vermutet haben, verwendet die JVM einen JIT-Compiler, wenn sie Bytecode ausführt. Werfen wir einen Blick auf ein Bytecode-Beispiel: Analyse von Interviewfragen und -antworten.  Teil 1 - 6Nicht gut lesbar, oder? Nun, das ist keine Anweisung für uns, sondern für die JVM. Hier ist ein Artikel , der Ihnen helfen wird, dieses Problem besser zu verstehen.

8. Was sind die Merkmale einer JavaBean?

JavaBeans ist eine Java-Klasse mit bestimmten Regeln. Hier sind einige Regeln zum Schreiben einer JavaBean :
  1. Die Klasse muss einen leeren (keine Parameter) öffentlichen Zugriffskonstruktor mit dem öffentlichen Zugriffsmodifikator enthalten . Dieser Konstruktor ermöglicht es, ein Objekt dieser Klasse ohne unnötige Probleme zu erstellen (so dass kein unnötiger Aufwand mit Parametern entsteht).

  2. Der Zugriff auf die internen Felder einer Klasse erfolgt über die Methoden get und set , die Standard sein sollten. Wenn das Feld beispielsweise „ name“ lautet , dann „getName“ und „setName “ usw. Dies wiederum ermöglicht es verschiedenen Tools (Frameworks), den Inhalt von Beans ohne Komplikationen automatisch zu ermitteln und zu aktualisieren.

  3. Die Klasse muss überschriebene Versionen der equal() -Methoden hashCode() und toString() enthalten .

  4. Die Klasse muss serialisierbar sein, das heißt, sie muss über eine Marker-Schnittstelle verfügen – Serialisierbar oder die Externalisierbare Schnittstelle implementieren . Dies ist notwendig, damit der Zustand der Bean zuverlässig gesichert, gespeichert und wiederhergestellt werden kann.

Analyse von Interviewfragen und -antworten.  Teil 1 - 7In diesem Material können Sie mehr über die Arten von JavaBeans erfahren .

9. Was ist OutOfMemoryError?

OutOfMemoryError ist einer der kritischen Laufzeitfehler im Zusammenhang mit dem Betrieb der Java Virtual Machine (JVM). Wird aufgerufen, wenn die JVM ein Objekt nicht zuweisen kann, weil nicht genügend Speicher dafür verfügbar ist und der Garbage Collector keinen weiteren Speicher zuweisen kann. Einige Arten von OutOfMemoryError :
  • OutOfMemoryError: Java-Heap-Speicherplatz – Das Objekt kann aufgrund unzureichenden Speichers nicht auf dem Java-Heap zugewiesen werden. Der Fehler kann durch einen Speicherverlust oder dadurch verursacht werden, dass die Standard-Heap-Größe nicht groß genug für die aktuelle Anwendung ist.

  • OutOfMemoryError: GC-Overhead-Grenze überschritten – aufgrund der Tatsache, dass die Datenmenge kaum in den Heap passt, der Garbage Collector die ganze Zeit läuft und das Java-Programm sehr langsam läuft, ist die Overhead-Grenze des Garbage Collectors überschritten überschritten wird und die Anwendung mit diesem Fehler abstürzt.

  • OutOfMemoryError: Die angeforderte Array-Größe überschreitet den VM-Grenzwert – weist darauf hin, dass die Anwendung versucht hat, Speicher für ein Array zuzuweisen, das größer als die Heap-Größe ist, was wiederum auf eine unzureichende Standardspeicherzuweisung zurückzuführen sein kann.

  • OutOfMemoryError: Metaspace – Dem Heap ist nicht mehr genügend Speicherplatz für Metadaten zugewiesen (Metadaten sind Anweisungen für Klassen und Methoden).

  • OutOfMemoryError: Größe Bytes aus Gründen anfordern. Nicht genügend Auslagerungsspeicher – beim Versuch, Speicher vom Heap zuzuordnen, ist ein Fehler aufgetreten, und als Folge davon gab es einen Speichermangel im Heap.

10. Was ist ein Stacktrace? Wie bekomme ich es?

Ein Stack Trace ist eine Liste von Klassen und Methoden, die bisher in der Anwendung aufgerufen wurden. Sie können einen Stack-Trace an einer bestimmten Stelle in der Anwendung wie folgt aufrufen:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
Auf diese Weise erhalten wir ein Array von Stack-Trace-Elementen, die in der LIFO-Reihenfolge „Last In First Out“ angeordnet sind . Analyse von Interviewfragen und -antworten.  Teil 1 - 8Wenn man in Java von einem Stack-Trace spricht, meint man in der Regel den Stack-Trace, der in der Konsole angezeigt wird, wenn ein Fehler (oder eine Ausnahme) auftritt. Sie können den Stack-Trace von Ausnahmen wie folgt abrufen:
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
Nun, wenn wir über die Ausgabe des Ausnahme-Stack-Trace in der Konsole sprechen:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
Wenn wir außerdem einen Fehler, eine ungeprüfte Ausnahme oder eine geprüfte Ausnahme haben , die wir nicht verarbeiten, sondern nur weiterleiten, erhalten wir beim Absturz der Anwendung automatisch einen Stack-Trace der Ausnahmen in der Konsole. Ein kleines Beispiel für eine Stack-Trace-Ausnahme in der Konsole: Analyse von Interviewfragen und -antworten.  Teil 1 - 9Mehr über Stack Trace können Sie hier lesen . Wir werden uns heute diesem Thema widmen...Analyse von Interviewfragen und -antworten.  Teil 1 - 10
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION