Java 8 Interviewfragen (Antworten)

Java 8 Interview Fragen (+ Antworten)

1. Einführung

In diesem Artikel werden wir einige der JDK8-bezogenen Fragen untersuchen, die während eines Interviews auftauchen könnten.

Java 8 ist eine Plattform-Version mit neuen Sprachfunktionen und Bibliotheksklassen. Die meisten dieser neuen Funktionen zielen darauf ab, saubereren und kompakteren Code zu erzielen, und einige bieten neue Funktionen, die in Java noch nie unterstützt wurden.

Weitere Lektüre:

Fragen im Vorstellungsgespräch zu Memory Management in Java (+ Antworten)

Eine Reihe beliebter Fragen und Antworten zum Thema Memory Management.

Read more

Fragen in Vorstellungsgesprächen bei Java Collections

Eine Reihe praktischer Fragen zu Java-Interviews im Zusammenhang mit Collections

Read more

2. Java 8 Allgemeinwissen

Q1. Welche neuen Funktionen wurden in Java 8 hinzugefügt?

Java 8 wird mit mehreren neuen Funktionen ausgeliefert, die wichtigsten sind jedoch die folgenden:

  • Lambda Expressions - eine neue Sprachfunktion, mit der Aktionen als Objekte behandelt werden können

  • Method References - Aktivieren Sie die Definition von Lambda-Ausdrücken, indem Sie direkt auf Methoden verweisen, deren Namen verwendet werden

  • Optional - spezielle Wrapper-Klasse zum Ausdrücken der Optionalität

  • Functional Interface - Eine Schnittstelle mit maximal einer abstrakten Methode. Die Implementierung kann mithilfe eines Lambda-Ausdrucks bereitgestellt werden

  • Default methods - gibt uns die Möglichkeit, neben abstrakten Methoden auch vollständige Implementierungen in Schnittstellen hinzuzufügen

  • Nashorn, JavaScript Engine - Java-basierte Engine zum Ausführen und Auswerten von JavaScript-Code

  • Stream API - eine spezielle Iteratorklasse, mit der Sammlungen von Objekten auf funktionale Weise verarbeitet werden können

  • Date API - eine verbesserte, unveränderliche, von JodaTime inspirierte Datums-API

Zusammen mit diesen neuen Funktionen werden viele Funktionsverbesserungen sowohl auf Compiler- als auch auf JVM-Ebene durchgeführt.

3. Methodenreferenzen

Q1. Was ist eine Methodenreferenz?

Eine Methodenreferenz ist ein Java 8-Konstrukt, mit dem auf eine Methode verwiesen werden kann, ohne sie aufzurufen. Es wird zur Behandlung von Methoden wie Lambda-Ausdrücken verwendet. Sie wirken nur als syntaktischer Zucker, um die Ausführlichkeit einiger Lambdas zu reduzieren. Auf diese Weise wird der folgende Code:

(o) -> o.toString();

kann werden:

Object::toString();

Eine Methodenreferenz kann durch einen Doppelpunkt gekennzeichnet werden, der einen Klassen- oder Objektnamen und den Namen der Methode voneinander trennt. Es hat verschiedene Variationen wie Konstruktorreferenz:

String::new;

Statische Methodenreferenz:

String::valueOf;

Referenz der gebundenen Instanzmethode:

str::toString;

Ungebundene Instanzmethodenreferenz:

String::toString;

Sie können eine detaillierte Beschreibung der Methodenreferenzen mit vollständigen Beispielen lesen, indem Siethis link undthis one folgen.

Q2. Was bedeutet String :: Valueof Expression?

Es ist eine statische Methodenreferenz auf dievalueOf-Methode derString-Klasse.

4. Optional

Q1. Was istOptional? Wie kann es verwendet werden?

Optional ist eine neue Klasse in Java 8, die einen optionalen Wert kapselt, d.h. Ein Wert, der entweder vorhanden ist oder nicht. Es ist ein Wrapper um ein Objekt, und Sie können es sich als einen Container mit null oder einem Element vorstellen.

Optional hat einen speziellenOptional.empty()-Wert anstelle vonnull. Daher kann es in vielen Fällen anstelle eines nullbaren Werts verwendet werden, umNullPointerException zu entfernen.

Sie können einen speziellen Artikel überOptionalhere lesen.

Der Hauptzweck vonOptional, wie er von seinen Erstellern entworfen wurde, bestand darin, Methoden zurückzugeben, die zuvornull zurückgaben. Solche Methoden würden erfordern, dass Sie Boilerplate-Code schreiben, um den Rückgabewert zu überprüfen, und könnten manchmal vergessen, eine defensive Prüfung durchzuführen. In Java 8 erfordert der Rückgabetyp einesOptionalexplizit, dass Sie null oder nicht null umschlossene Werte unterschiedlich behandeln.

Beispielsweise berechnet die MethodeStream.min() den Mindestwert in einem Wertestrom. Aber was ist, wenn der Stream leer ist? OhneOptional würde die Methodenull zurückgeben oder eine Ausnahme auslösen.

Es wird jedoch einOptional-Wert zurückgegeben, derOptional.empty() sein kann (der zweite Fall). Dies ermöglicht es uns, solche Fälle einfach zu behandeln:

int min1 = Arrays.stream(new int[]{1, 2, 3, 4, 5})
  .min()
  .orElse(0);
assertEquals(1, min1);

int min2 = Arrays.stream(new int[]{})
  .min()
  .orElse(0);
assertEquals(0, min2);

Es ist erwähnenswert, dassOptional keine Allzweckklasse wieOption in Scala ist. Es wird nicht empfohlen, als Feldwert in Entitätsklassen verwendet zu werden. Dies wird deutlich dadurch angezeigt, dass dieSerializable-Schnittstelle nicht implementiert wird.

5. Funktionale Schnittstellen

Q1. Beschreiben einiger funktionaler Schnittstellen in der Standardbibliothek.

Das Paketjava.util.functionenthält viele funktionale Schnittstellen. Zu den gebräuchlichsten gehören unter anderem:

  • Function - Es wird ein Argument verwendet und ein Ergebnis zurückgegeben

  • Consumer - es wird ein Argument verwendet und es wird kein Ergebnis zurückgegeben (stellt einen Nebeneffekt dar)

  • Supplier - Es wird kein Argument verwendet und ein Ergebnis zurückgegeben

  • Predicate - Es wird ein Argument verwendet und ein Boolescher Wert zurückgegeben

  • BiFunction - Es werden zwei Argumente verwendet und ein Ergebnis zurückgegeben

  • BinaryOperator - Es ähnelt einemBiFunction, nimmt zwei Argumente und gibt ein Ergebnis zurück. Die beiden Argumente und das Ergebnis sind alle vom selben Typ

  • UnaryOperator - Es ähnelt einemFunction, wobei ein einzelnes Argument verwendet und ein Ergebnis desselben Typs zurückgegeben wird

Weitere Informationen zu Funktionsschnittstellen finden Sie im Artikel“Functional Interfaces in Java 8”.

Q2. Was ist eine funktionale Schnittstelle? Was sind die Regeln zum Definieren einer funktionalen Schnittstelle?

Eine funktionale Schnittstelle ist eine Schnittstelle mit nicht mehr und nicht weniger als einer einzigen abstrakten Methode (defaultMethoden zählen nicht).

Wenn eine Instanz einer solchen Schnittstelle erforderlich ist, kann stattdessen ein Lambda-Ausdruck verwendet werden. Formeller ausgedrückt:Functional interfaces bieten Zieltypen für Lambda-Ausdrücke und Methodenreferenzen.

Die Argumente und der Rückgabetyp eines solchen Ausdrucks stimmen direkt mit denen der einzelnen abstrakten Methode überein.

Zum Beispiel ist dieRunnable-Schnittstelle eine funktionale Schnittstelle, also anstelle von:

Thread thread = new Thread(new Runnable() {
    public void run() {
        System.out.println("Hello World!");
    }
});

Sie könnten einfach tun:

Thread thread = new Thread(() -> System.out.println("Hello World!"));

Funktionale Schnittstellen werden normalerweise mit der Annotation@FunctionalInterface kommentiert - dies ist informativ und hat keinen Einfluss auf die Semantik.

6. Standardmethode

Q1. Was ist eine Standardmethode und wann verwenden wir sie?

Eine Standardmethode ist eine Methode mit einer Implementierung, die sich in einer Schnittstelle befindet.

Wir können eine Standardmethode verwenden, um einer Schnittstelle eine neue Funktionalität hinzuzufügen, während die Abwärtskompatibilität mit Klassen erhalten bleibt, die die Schnittstelle bereits implementieren:

public interface Vehicle {
    public void move();
    default void hoot() {
        System.out.println("peep!");
    }
}

Wenn einer Schnittstelle eine neue abstrakte Methode hinzugefügt wird, werden normalerweise alle implementierenden Klassen unterbrochen, bis sie die neue abstrakte Methode implementieren. In Java 8 wurde dieses Problem mit der Standardmethode behoben.

Beispielsweise verfügt die Schnittstelle vonCollectionnicht über die Methodendeklaration vonforEach. Das Hinzufügen einer solchen Methode würde also einfach die gesamte Sammlungs-API beschädigen.

Java 8 führt die Standardmethode ein, sodass die Schnittstelle vonCollectioneine Standardimplementierung der Methode vonforEachhaben kann, ohne dass die Klassen, die diese Schnittstelle implementieren, dieselbe implementieren müssen.

Q2. Wird der folgende Code kompiliert?

@FunctionalInterface
public interface Function2 {
    public V apply(T t, U u);

    default void count() {
        // increment counter
    }
}

Yes. Der Code wird kompiliert, da er der funktionalen Schnittstellenspezifikation folgt, dass nur eine einzige abstrakte Methode definiert wird. Die zweite Methode,count, ist eine Standardmethode, die die Anzahl der abstrakten Methoden nicht erhöht.

7. Lambda-Ausdrücke

Q1. Was ist ein Lambda-Ausdruck und wofür wird er verwendet?

In sehr einfachen Worten ist ein Lambda-Ausdruck eine Funktion, die als Objekt referenziert und weitergegeben werden kann.

Lambda-Ausdrücke führen die Funktionsstilverarbeitung in Java ein und erleichtern das Schreiben von kompaktem und einfach zu lesendem Code.

Aus diesem Grund sind Lambda-Ausdrücke ein natürlicher Ersatz für anonyme Klassen als Methodenargumente. Eine ihrer Hauptanwendungen besteht darin, Inline-Implementierungen von Funktionsschnittstellen zu definieren.

Q2. Erklären Sie die Syntax und Eigenschaften eines Lambda-Ausdrucks

Ein Lambda-Ausdruck besteht aus zwei Teilen: dem Parameterteil und dem Ausdrucksteil, die durch einen Vorwärtspfeil wie folgt getrennt sind:

params -> expressions

Jeder Lambda-Ausdruck weist die folgenden Merkmale auf:

  • Optional type declaration - Wenn Sie die Parameter auf der linken Seite des Lambda deklarieren, müssen Sie ihre Typen nicht deklarieren, da der Compiler sie aus ihren Werten ableiten kann. Also sindint param → … undparam →… alle gültig

  • Optional parentheses - Wenn nur ein einzelner Parameter deklariert ist, müssen wir ihn nicht in Klammern setzen. Dies bedeutet, dassparam → … und(param) → … alle gültig sind. Wenn jedoch mehr als ein Parameter deklariert ist, sind Klammern erforderlich

  • Optional curly braces - Wenn der Ausdrucksteil nur eine einzige Anweisung enthält, sind keine geschweiften Klammern erforderlich. Dies bedeutet, dassparam – > statement undparam – > \{statement;} alle gültig sind. Geschweifte Klammern sind jedoch erforderlich, wenn mehr als eine Anweisung vorhanden ist

  • Optional return statement - Wenn der Ausdruck einen Wert zurückgibt und in geschweifte Klammern eingeschlossen ist, benötigen wir keine return-Anweisung. Das heißt,(a, b) – > \{return a+b;} und(a, b) – > \{a+b;} sind beide gültig

Um mehr über Lambda-Ausdrücke zu erfahren, folgen Siethis link undthis one.

8. Nashorn Javascript

Q1. Was ist Nashorn in Java8?

Nashorn ist die neue Javascript-Verarbeitungs-Engine für die Java-Plattform, die mit Java 8 ausgeliefert wurde. Bis JDK 7 verwendete die Java-Plattform Mozilla Rhino zum gleichen Zweck. als Javascript-Verarbeitungsmaschine.

Nashorn bietet eine bessere Konformität mit der ECMA-normierten JavaScript-Spezifikation und eine bessere Laufzeitleistung als sein Vorgänger.

Q2. Was ist JJS?

In Java 8 istjjs die neue ausführbare Datei oder das Befehlszeilentool, mit dem Javascript-Code auf der Konsole ausgeführt wird.

9. Streams

Q1. Was ist ein Stream? Wie unterscheidet es sich von einer Sammlung?

In einfachen Worten ist ein Stream ein Iterator, dessen Aufgabe es ist, eine Reihe von Aktionen zu akzeptieren, die auf jedes der enthaltenen Elemente angewendet werden sollen.

The stream repräsentiert eine Folge von Objekten aus einer Quelle wie einer Sammlung, die Aggregatoperationen unterstützt. Sie wurden entwickelt, um die Sammelbearbeitung einfach und übersichtlich zu gestalten. Im Gegensatz zu den Sammlungen ist die Iterationslogik im Stream implementiert, sodass wir Methoden wiemap undflatMap verwenden können, um eine deklarative Verarbeitung durchzuführen.

Ein weiterer Unterschied besteht darin, dass dieStream-API fließend ist und Pipelining ermöglicht:

int sum = Arrays.stream(new int[]{1, 2, 3})
  .filter(i -> i >= 2)
  .map(i -> i * 3)
  .sum();

Ein weiterer wichtiger Unterschied zu Sammlungen besteht darin, dass Streams inhärent träge geladen und verarbeitet werden.

Q2. Was ist der Unterschied zwischen Zwischen- und Terminalbetrieb?

Stream-Operationen werden zu Pipelines zusammengefasst, um Streams zu verarbeiten. Alle Operationen sind entweder Zwischenoperationen oder Terminaloperationen.

Zwischenoperationen sind solche Operationen, dieStream selbst zurückgeben und weitere Operationen in einem Stream ermöglichen.

Diese Operationen sind immer faul, d.h. Sie verarbeiten den Stream nicht am Anrufstandort. Eine Zwischenoperation kann nur Daten verarbeiten, wenn eine Terminaloperation vorliegt. Einige der Zwischenoperationen sindfilter,map undflatMap.

Terminaloperationen beenden die Pipeline und leiten die Stream-Verarbeitung ein. Der Stream wird während des Terminal-Operations-Aufrufs durch alle Zwischenoperationen geleitet. Terminaloperationen umfassenforEach,reduce, Collect undsum.

Um diesen Punkt nach Hause zu bringen, sehen wir uns ein Beispiel mit Nebenwirkungen an:

public static void main(String[] args) {
    System.out.println("Stream without terminal operation");

    Arrays.stream(new int[] { 1, 2, 3 }).map(i -> {
        System.out.println("doubling " + i);
        return i * 2;
    });

    System.out.println("Stream with terminal operation");
        Arrays.stream(new int[] { 1, 2, 3 }).map(i -> {
            System.out.println("doubling " + i);
            return i * 2;
    }).sum();
}

Die Ausgabe sieht wie folgt aus:

Stream without terminal operation
Stream with terminal operation
doubling 1
doubling 2
doubling 3

Wie Sie sehen, werden die Zwischenoperationen nur ausgelöst, wenn eine Terminaloperation vorhanden ist.

Q3. Was ist der Unterschied zwischenMap undflatMap Stream-Betrieb?

Es gibt einen Unterschied in der Signatur zwischenmap undflatMap. Im Allgemeinen umschließt einemap-Operation ihren Rückgabewert innerhalb ihres Ordnungs-Typs, währendflatMap dies nicht tut.

Beispielsweise würde inOptional einemap-OperationOptional<String> Typ zurückgeben, währendflatMapString Typ zurückgeben würde.

Nach dem Mapping muss man das Objekt auspacken ("abflachen" lesen), um den Wert abzurufen, wohingegen nach dem Abflachen keine Notwendigkeit besteht, da das Objekt bereits abgeflacht ist. Das gleiche Konzept wird auf Mapping und Flat Mapping inStream angewendet.

Sowohlmap als auchflatMap sind Zwischenstromoperationen, die eine Funktion empfangen und diese Funktion auf alle Elemente eines Stroms anwenden.

Der Unterschied besteht darin, dass diese Funktion fürmap einen Wert zurückgibt, fürflatMap jedoch einen Stream zurückgibt. Die OperationflatMap"glättet" die Streams zu einem.

In diesem Beispiel nehmen wir eine Karte mit Benutzernamen und Telefonlisten und reduzieren sie auf eine Liste mit Telefonen aller Benutzer, dieflatMap verwenden:

Map> people = new HashMap<>();
people.put("John", Arrays.asList("555-1123", "555-3389"));
people.put("Mary", Arrays.asList("555-2243", "555-5264"));
people.put("Steve", Arrays.asList("555-6654", "555-3242"));

List phones = people.values().stream()
  .flatMap(Collection::stream)
    .collect(Collectors.toList());

Q4. Was ist Stream Pipelining in Java 8?

Stream-Pipelining ist das Konzept der Verkettung von Vorgängen. Dies erfolgt durch Aufteilen der Vorgänge, die in einem Stream ausgeführt werden können, in zwei Kategorien: Zwischenvorgänge und Terminalvorgänge.

Jede Zwischenoperation gibt eine Instanz von Stream selbst zurück, wenn sie ausgeführt wird. Daher kann eine beliebige Anzahl von Zwischenoperationen eingerichtet werden, um Daten zu verarbeiten, die eine Verarbeitungspipeline bilden.

Es muss dann eine Terminaloperation geben, die einen Endwert zurückgibt und die Pipeline beendet.

10. Java 8 Datums- und Uhrzeit-API

Q1. Informieren Sie uns über die neue Datums- und Uhrzeit-API in Java 8

Ein seit langem bestehendes Problem für Java-Entwickler war die unzureichende Unterstützung für die von normalen Entwicklern benötigten Datums- und Zeitmanipulationen.

Die vorhandenen Klassen wiejava.util.Date undSimpleDateFormatter sind nicht threadsicher, was zu potenziellen Parallelitätsproblemen für Benutzer führt.

Schlechtes API-Design ist auch in der alten Java-Daten-API Realität. Hier nur ein kurzes Beispiel: Jahre injava.util.Datebeginnen bei 1900, Monate beginnen bei 1 und Tage beginnen bei 0, was nicht sehr intuitiv ist.

Diese und andere Probleme haben zur Popularität von Datums- und Zeitbibliotheken von Drittanbietern wie Joda-Time geführt.

Um diese Probleme zu beheben und eine bessere Unterstützung in JDK zu bieten, wurde für Java SE 8 unter dem Paketjava.time eine neue Datums- und Uhrzeit-API entwickelt, die frei von diesen Problemen ist.

11. Fazit

In diesem Artikel haben wir einige sehr wichtige Fragen für technische Interviewfragen mit einem Schwerpunkt auf Java 8 untersucht. Dies ist keine vollständige Liste, sondern enthält nur Fragen, von denen wir glauben, dass sie in jeder neuen Funktion von Java 8 am wahrscheinlichsten auftreten.

Selbst wenn Sie gerade erst anfangen, ist die Unkenntnis von Java 8 kein guter Weg, um ein Interview zu führen, insbesondere wenn Java in Ihrem Lebenslauf stark vertreten ist. Es ist daher wichtig, dass Sie sich etwas Zeit nehmen, um die Antworten auf diese Fragen zu verstehen und möglicherweise mehr Nachforschungen anzustellen.

Viel Glück bei deinem Interview.