Einführung
Wenn Sie sich für eine Java-Programmierrolle bewerben, werden wahrscheinlich Ihre Codierfähigkeiten getestet. Egal, ob Sie ein Anfänger in Java oder ein Experte Programmierer sind, bietet dieser Artikel einige gängige Java-Interviewfragen und Antworten, um Ihnen bei der Vorbereitung zu helfen.
1. Wie kann man einen String in Java umkehren?
Es gibt keine reverse()
-Hilfsmethode in der String
-Klasse. Sie können jedoch ein Zeichenarray aus dem String erstellen und es dann vom Ende bis zum Anfang durchlaufen. Sie können die Zeichen an einen StringBuilder anhängen und schließlich den umgekehrten String zurückgeben.
Das folgende Beispiel zeigt eine Möglichkeit, einen String umzukehren:
public class StringPrograms {
public static void main(String[] args) {
String str = "123";
System.out.println(reverse(str));
}
public static String reverse(String in) {
if (in == null)
throw new IllegalArgumentException("Null is not valid input");
StringBuilder out = new StringBuilder();
char[] chars = in.toCharArray();
for (int i = chars.length - 1; i >= 0; i--)
out.append(chars[i]);
return out.toString();
}
}
Bonuspunkte für das Hinzufügen einer null
-Überprüfung in der Methode und Verwendung von StringBuilder
zum Anhängen der Zeichen. Beachten Sie, dass die Indizierung in Java bei 0 beginnt, sodass Sie in der for
-Schleife bei chars.length - 1
beginnen müssen.
2. Wie tauschen Sie zwei Zahlen in Java ohne Verwendung einer dritten Variablen aus?
Das Tauschen von Zahlen ohne Verwendung einer dritten Variablen ist ein dreistufiger Prozess, der besser im Code visualisiert wird:
b = b + a; // now b is sum of both the numbers
a = b - a; // b - a = (b + a) - a = b (a is swapped)
b = b - a; // (b + a) - b = a (b is swapped)
Das folgende Beispiel zeigt eine Möglichkeit, die Methode zum Tauschen von Zahlen zu implementieren:
public class SwapNumbers {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a is " + a + " and b is " + b);
a = a + b;
b = a - b;
a = a - b;
System.out.println("After swapping, a is " + a + " and b is " + b);
}
}
Die Ausgabe zeigt, dass die ganzzahligen Werte ausgetauscht sind:
Outputa is 10 and b is 20
After swapping, a is 20 and b is 10
3. Schreiben Sie ein Java-Programm, um zu überprüfen, ob ein Vokal in einem String vorhanden ist.
Das folgende Beispiel zeigt, wie Sie einen regulären Ausdruck verwenden, um zu überprüfen, ob der String Vokale enthält:
public class StringContainsVowels {
public static void main(String[] args) {
System.out.println(stringContainsVowels("Hello")); // true
System.out.println(stringContainsVowels("TV")); // false
}
public static boolean stringContainsVowels(String input) {
return input.toLowerCase().matches(".*[aeiou].*");
}
}
4. Schreiben Sie ein Java-Programm, um zu überprüfen, ob die angegebene Zahl eine Primzahl ist.
Sie können ein Programm schreiben, um die gegebene Zahl n
durch eine Zahl von 2 bis n
/2 zu teilen und den Rest zu überprüfen. Wenn der Rest 0 ist, handelt es sich nicht um eine Primzahl. Der folgende Beispielcode zeigt eine Möglichkeit, zu überprüfen, ob eine gegebene Zahl eine Primzahl ist:
public class PrimeNumberCheck {
public static void main(String[] args) {
System.out.println(isPrime(19)); // true
System.out.println(isPrime(49)); // false
}
public static boolean isPrime(int n) {
if (n == 0 || n == 1) {
return false;
}
if (n == 2) {
return true;
}
for (int i = 2; i <= n / 2; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
Obwohl dieses Programm funktioniert, ist es nicht sehr speicher- und zeiteffizient. Beachten Sie, dass für eine gegebene Zahl N
gilt: Wenn es eine Primzahl M
zwischen 2
und √N
(Quadratwurzel von N) gibt, die sie gleichmäßig teilt, ist N
keine Primzahl.
5. Schreiben Sie ein Java-Programm, um eine Fibonacci-Folge mit Rekursion zu drucken.
A Fibonacci sequence is one in which each number is the sum of the two previous numbers. In this example, the sequence begins with 0
and 1
. The following example code shows how to use a for
loop to print a Fibonacci sequence:
public class PrintFibonacci {
public static void printFibonacciSequence(int count) {
int a = 0;
int b = 1;
int c = 1;
for (int i = 1; i <= count; i++) {
System.out.print(a + ", ");
a = b;
b = c;
c = a + b;
}
}
public static void main(String[] args) {
printFibonacciSequence(10);
}
}
Output0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
Sie können auch Rekursion verwenden, um eine Fibonacci-Folge zu drucken, da die Fibonacci-Zahl durch Hinzufügen der beiden vorherigen Zahlen in der Sequenz generiert wird:
F(N) = F(N-1) + F(N-2)
Die folgende Beispielklasse zeigt, wie Rekursion verwendet wird, um eine Fibonacci-Folge von 10 Zahlen zu berechnen:
public class PrintFibonacciRecursive {
public static int fibonacci(int count) {
if (count <= 1)
return count;
return fibonacci(count - 1) + fibonacci(count - 2);
}
public static void main(String args[]) {
int seqLength = 10;
System.out.print("A Fibonacci sequence of " + seqLength + " numbers: ");
for (int i = 0; i < seqLength; i++) {
System.out.print(fibonacci(i) + " ");
}
}
}
OutputA Fibonacci sequence of 10 numbers: 0 1 1 2 3 5 8 13 21 34
6. Wie überprüfen Sie, ob eine Liste von Ganzzahlen nur ungerade Zahlen in Java enthält?
Sie können eine for
-Schleife verwenden und überprüfen, ob jedes Element ungerade ist:
public static boolean onlyOddNumbers(List<Integer> list) {
for (int i : list) {
if (i % 2 == 0)
return false;
}
return true;
}
Wenn die Liste groß ist, können Sie einen parallelen Stream für eine schnellere Verarbeitung verwenden, wie im folgenden Beispielcode gezeigt:
public static boolean onlyOddNumbers(List<Integer> list) {
return list
.parallelStream() // paralleler Stream für schnellere Verarbeitung
.anyMatch(x -> x % 2 != 0); // geben Sie zurück, sobald ein Element der Bedingung entspricht
}
Um mehr über die Mathematik hinter der Bestimmung, ob eine ganze Zahl ungerade ist, zu erfahren, lesen Sie den Modulo-Betrieb auf Wikipedia.
7. Wie überprüfen Sie, ob eine Zeichenfolge in Java ein Palindrom ist?
A palindrome string is the same string backwards or forwards. To check for a palindrome, you can reverse the input string and check if the result is equal to the input. The following example code shows how to use the String charAt(int index)
method to check for palindrome strings:
boolean checkPalindromeString(String input) {
boolean result = true;
int length = input.length();
for (int i = 0; i < length/2; i++) {
if (input.charAt(i) != input.charAt(length - i - 1)) {
result = false;
break;
}
}
return result;
}
8. Wie entfernen Sie Leerzeichen aus einer Zeichenfolge in Java?
Der folgende Beispielcode zeigt eine Möglichkeit, Leerzeichen aus einem String zu entfernen, indem die Methode Character.isWhitespace()
verwendet wird:
String removeWhiteSpaces(String input) {
StringBuilder output = new StringBuilder();
char[] charArray = input.toCharArray();
for (char c : charArray) {
if (!Character.isWhitespace(c))
output.append(c);
}
return output.toString();
}
Erfahren Sie mehr darüber, wie Sie Leerzeichen und andere Zeichen aus einem String in Java entfernen.
9. Wie entfernen Sie führende und abschließende Leerzeichen aus einem String in Java?
Die Klasse String
enthält zwei Methoden zum Entfernen von führenden und abschließenden Leerzeichen: trim()
und strip()
. Die strip()
-Methode wurde der Klasse String
in Java 11 hinzugefügt. Die strip()
-Methode verwendet die Methode Character.isWhitespace()
, um zu überprüfen, ob das Zeichen ein Leerzeichen ist. Diese Methode verwendet Unicode-Zeichenpunkte, während die trim()
-Methode jedes Zeichen mit einem Codepunktwert kleiner oder gleich U+0020
als Leerzeichenzeichen identifiziert.
Die strip()
-Methode ist der empfohlene Weg, um Leerzeichen zu entfernen, da sie den Unicode-Standard verwendet. Der folgende Beispielcode zeigt, wie die strip()
-Methode verwendet wird, um Leerzeichen zu entfernen:
String s = " abc def\t";
s = s.strip();
System.out.println(s);
Da String
unveränderlich ist, müssen Sie den Ausgang von strip()
dem String zuweisen.
10. Wie sortiert man ein Array in Java?
Die Utility-Klasse Arrays
bietet viele überladene sort()
-Methoden zum Sortieren von primitiven und Objekt-Arrays. Wenn Sie ein primitives Array in natürlicher Reihenfolge sortieren möchten, können Sie die Methode Arrays.sort()
verwenden, wie im folgenden Beispiel gezeigt:
int[] array = {1, 2, 3, -1, -2, 4};
Arrays.sort(array);
System.out.println(Arrays.toString(array));
Wenn Sie jedoch ein Array von Objekten sortieren möchten, muss das Objekt das Comparable
-Interface implementieren. Wenn Sie die Sortierkriterien festlegen möchten, können Sie den Comparator
für die Sortierlogik übergeben. Erfahren Sie mehr über Comparable und Comparator in Java.
11. Wie erstellt man programmatisch ein Deadlock-Szenario in Java?
Ein Deadlock ist eine Situation in einer mehrfädigen Java-Umgebung, bei der zwei oder mehr Threads dauerhaft blockiert sind. Die Deadlock-Situation tritt auf, wenn sich mindestens zwei Threads gegenseitig blockieren. Der folgende Beispielcode erstellt ein Deadlock-Szenario:
public class ThreadDeadlock {
public static void main(String[] args) throws InterruptedException {
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = new Object();
Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1");
Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2");
Thread t3 = new Thread(new SyncThread(obj3, obj1), "t3");
t1.start();
Thread.sleep(5000);
t2.start();
Thread.sleep(5000);
t3.start();
}
}
class SyncThread implements Runnable {
private Object obj1;
private Object obj2;
public SyncThread(Object o1, Object o2) {
this.obj1 = o1;
this.obj2 = o2;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name + " acquiring lock on " + obj1);
synchronized (obj1) {
System.out.println(name + " acquired lock on " + obj1);
work();
System.out.println(name + " acquiring lock on " + obj2);
synchronized (obj2) {
System.out.println(name + " acquired lock on " + obj2);
work();
}
System.out.println(name + " released lock on " + obj2);
}
System.out.println(name + " released lock on " + obj1);
System.out.println(name + " finished execution.");
}
private void work() {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Alle drei Threads werden in der Lage sein, ein Schloss auf dem ersten Objekt zu erwerben. Sie verwenden jedoch gemeinsame Ressourcen und werden so gestartet, dass sie unendlich lange darauf warten, das Schloss auf dem zweiten Objekt zu erwerben. Sie können den Java-Thread-Dump verwenden, um Deadlocks zu erkennen. Erfahren Sie mehr über Deadlocks in Java.
12. Wie können Sie die Fakultät einer ganzen Zahl in Java finden?
Die Fakultät einer ganzen Zahl wird berechnet, indem alle Zahlen von 1 bis zur gegebenen Zahl multipliziert werden:
F(n) = F(1)*F(2)...F(n-1)*F(n)
Das folgende Beispiel zeigt, wie Sie Rekursion verwenden, um die Fakultät einer ganzen Zahl zu finden:
public static long factorial(long n) {
if (n == 1)
return 1;
else
return (n * factorial(n - 1));
}
13. Wie kehren Sie eine verkettete Liste in Java um?
LinkedList descendingIterator()
gibt einen Iterator zurück, der über die Elemente in umgekehrter Reihenfolge iteriert. Das folgende Beispiel zeigt, wie Sie diesen Iterator verwenden, um eine neue verkettete Liste mit Elementen in umgekehrter Reihenfolge zu erstellen:
LinkedList<Integer> ll = new LinkedList<>();
ll.add(1);
ll.add(2);
ll.add(3);
System.out.println(ll);
LinkedList<Integer> ll1 = new LinkedList<>();
ll.descendingIterator().forEachRemaining(ll1::add);
System.out.println(ll1);
Erfahren Sie mehr über das Umkehren einer verketteten Liste aus der Perspektive von Datenstrukturen und Algorithmen.
14. Wie implementiert man eine binäre Suche in Java?
Die Array-Elemente müssen sortiert sein, um eine binäre Suche zu implementieren. Der binäre Suchalgorithmus basiert auf den folgenden Bedingungen:
- Wenn der Schlüssel kleiner als das mittlere Element ist, müssen Sie nur noch in der ersten Hälfte des Arrays suchen.
- Wenn der Schlüssel größer als das mittlere Element ist, müssen Sie nur noch in der zweiten Hälfte des Arrays suchen.
- Wenn der Schlüssel dem mittleren Element im Array entspricht, endet die Suche.
- Zum Schluss, wenn der Schlüssel im gesamten Array nicht gefunden wird, sollte er
-1
zurückgeben. Dies zeigt an, dass das Element nicht vorhanden ist.
Das folgende Beispielcode implementiert eine binäre Suche:
public static int binarySearch(int arr[], int low, int high, int key) {
int mid = (low + high) / 2;
while (low <= high) {
if (arr[mid] < key) {
low = mid + 1;
} else if (arr[mid] == key) {
return mid;
} else {
high = mid - 1;
}
mid = (low + high) / 2;
}
if (low > high) {
return -1;
}
return -1;
}
15. Schreiben Sie ein Java-Programm, das Merge-Sort veranschaulicht.
Merge Sort ist einer der effizientesten Sortieralgorithmen. Er arbeitet nach dem Prinzip von „Teile und Herrsche“. Der Algorithmus zerlegt eine Liste in mehrere Unterlisten, bis jede Unterliste nur ein einzelnes Element enthält, und fusioniert dann diese Unterlisten so, dass eine sortierte Liste entsteht. Der folgende Beispielcode zeigt eine Möglichkeit, Merge Sort zu verwenden:
public class MergeSort {
public static void main(String[] args) {
int[] arr = { 70, 50, 30, 10, 20, 40, 60 };
int[] merged = mergeSort(arr, 0, arr.length - 1);
for (int val : merged) {
System.out.print(val + " ");
}
}
public static int[] mergeTwoSortedArrays(int[] one, int[] two) {
int[] sorted = new int[one.length + two.length];
int i = 0;
int j = 0;
int k = 0;
while (i < one.length && j < two.length) {
if (one[i] < two[j]) {
sorted[k] = one[i];
k++;
i++;
} else {
sorted[k] = two[j];
k++;
j++;
}
}
if (i == one.length) {
while (j < two.length) {
sorted[k] = two[j];
k++;
j++;
}
}
if (j == two.length) {
while (i < one.length) {
sorted[k] = one[i];
k++;
i++;
}
}
return sorted;
}
public static int[] mergeSort(int[] arr, int lo, int hi) {
if (lo == hi) {
int[] br = new int[1];
br[0] = arr[lo];
return br;
}
int mid = (lo + hi) / 2;
int[] fh = mergeSort(arr, lo, mid);
int[] sh = mergeSort(arr, mid + 1, hi);
int[] merged = mergeTwoSortedArrays(fh, sh);
return merged;
}
}
16. Können Sie in Java einen Zeichenpyramide erstellen?
Musterprogramme sind ein sehr beliebtes Thema in Vorstellungsgesprächen. Diese Art von Frage dient dazu, die logischen Denkfähigkeiten des Bewerbers zu verstehen. Siehe Pyramid Pattern Programs in Java für Beispiele verschiedener Möglichkeiten, Pyramidenmuster zu erstellen.
17. Schreiben Sie ein Java-Programm, das überprüft, ob zwei Arrays dieselben Elemente enthalten.
Um zu überprüfen, ob zwei Arrays die gleichen Elemente enthalten, müssen Sie zunächst eine Menge von Elementen aus beiden Arrays erstellen und dann die Elemente in diesen Mengen vergleichen, um festzustellen, ob es ein Element gibt, das in beiden Mengen nicht vorhanden ist. Der folgende Beispielcode zeigt, wie man überprüft, ob zwei Arrays nur gemeinsame Elemente enthalten:
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class ArraySameElements {
public static void main(String[] args) {
Integer[] a1 = {1,2,3,2,1};
Integer[] a2 = {1,2,3};
Integer[] a3 = {1,2,3,4};
System.out.println(sameElements(a1, a2));
System.out.println(sameElements(a1, a3));
}
static boolean sameElements(Object[] array1, Object[] array2) {
Set<Object> uniqueElements1 = new HashSet<>(Arrays.asList(array1));
Set<Object> uniqueElements2 = new HashSet<>(Arrays.asList(array2));
// Wenn die Größe unterschiedlich ist, gibt es eine Ungleichheit
if (uniqueElements1.size() != uniqueElements2.size()) return false;
for (Object obj : uniqueElements1) {
// Element nicht in beiden Arrays vorhanden?
if (!uniqueElements2.contains(obj)) return false;
}
return true;
}
}
Outputtrue
false
18. Wie berechnet man die Summe aller Elemente in einem Integer-Array in Java?
Sie können eine Schleife verwenden, um über die Array-Elemente zu iterieren und sie zu addieren, um die endgültige Summe zu erhalten:
int[] array = { 1, 2, 3, 4, 5 };
int sum = 0;
for (int i : array)
sum += i;
System.out.println(sum);
19. Wie findet man die zweitgrößte Zahl in einem Array in Java?
Es gibt viele Möglichkeiten, dieses Problem zu lösen. Sie können das Array in natürlicher aufsteigender Reihenfolge sortieren und den zweitletzten Wert nehmen. Das Sortieren ist jedoch eine aufwändige Operation. Sie können auch zwei Variablen verwenden, um den zweitgrößten Wert in einer einzigen Iteration zu finden, wie im folgenden Beispiel gezeigt:
private static int findSecondHighest(int[] array) {
int highest = Integer.MIN_VALUE;
int secondHighest = Integer.MIN_VALUE;
for (int i : array) {
if (i > highest) {
secondHighest = highest;
highest = i;
} else if (i > secondHighest) {
secondHighest = i;
}
}
return secondHighest;
}
20. Wie mischt man ein Array in Java?
Das folgende Beispiel zeigt, wie man die Klasse Random
verwendet, um zufällige Indexnummern zu generieren und die Elemente zu mischen:
int[] array = { 1, 2, 3, 4, 5, 6, 7 };
Random rand = new Random();
for (int i = 0; i < array.length; i++) {
int randomIndexToSwap = rand.nextInt(array.length);
int temp = array[randomIndexToSwap];
array[randomIndexToSwap] = array[i];
array[i] = temp;
}
System.out.println(Arrays.toString(array));
Sie können den Mischcode innerhalb einer weiteren for
-Schleife ausführen, um mehrere Runden zu mischen.
21. Wie findet man eine Zeichenkette in einer Textdatei in Java?
Der folgende Beispielcode zeigt, wie man die Klasse Scanner
verwendet, um den Dateiinhalt zeilenweise zu lesen, und dann die Methode String contains()
verwendet, um zu überprüfen, ob die Zeichenkette in der Datei vorhanden ist:
boolean findStringInFile(String filePath, String str) throws FileNotFoundException {
File file = new File(filePath);
Scanner scanner = new Scanner(file);
// Datei zeilenweise lesen
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.contains(str)) {
scanner.close();
return true;
}
}
scanner.close();
return false;
}
Beachten Sie, dass der Beispielcode davon ausgeht, dass die Zeichenkette, nach der Sie in der Datei suchen, keine Zeilenumbruchszeichen enthält.
22. Wie gibt man ein Datum in einem bestimmten Format in Java aus?
Das folgende Beispielcode zeigt, wie die Klasse SimpleDateFormat
verwendet wird, um den Datumsstring zu formatieren:
String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date); // 06-23-2020
Erfahren Sie mehr über die Java SimpleDateFormat.
23. Wie fusionieren Sie zwei Listen in Java?
Das folgende Beispielcode zeigt, wie die Methode addAll()
verwendet wird, um mehrere Listen in Java zu fusionieren:
List<String> list1 = new ArrayList<>();
list1.add("1");
List<String> list2 = new ArrayList<>();
list2.add("2");
List<String> mergedList = new ArrayList<>(list1);
mergedList.addAll(list2);
System.out.println(mergedList); // [1, 2]
24. Schreiben Sie ein Java-Programm, das HashMap nach Wert sortiert.
HashMap
ist keine geordnete Sammlung. Das folgende Beispielcode zeigt, wie die Einträge basierend auf dem Wert sortiert und in LinkedHashMap
gespeichert werden, das die Reihenfolge der Einfügung beibehält:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class SortHashMapByValue {
public static void main(String[] args) {
Map<String, Integer> scores = new HashMap<>();
scores.put("David", 95);
scores.put("Jane", 80);
scores.put("Mary", 97);
scores.put("Lisa", 78);
scores.put("Dino", 65);
System.out.println(scores);
scores = sortByValue(scores);
System.out.println(scores);
}
private static Map<String, Integer> sortByValue(Map<String, Integer> scores) {
Map<String, Integer> sortedByValue = new LinkedHashMap<>();
// Eintragssatz abrufen
Set<Entry<String, Integer>> entrySet = scores.entrySet();
System.out.println(entrySet);
// Erstellen Sie eine Liste, da der Satz ungeordnet ist
List<Entry<String, Integer>> entryList = new ArrayList<>(entrySet);
System.out.println(entryList);
// Sortieren Sie die Liste nach Wert
entryList.sort((x, y) -> x.getValue().compareTo(y.getValue()));
System.out.println(entryList);
// Füllen Sie die neue HashMap
for (Entry<String, Integer> e : entryList)
sortedByValue.put(e.getKey(), e.getValue());
return sortedByValue;
}
}
25. Wie entfernen Sie alle Vorkommen eines bestimmten Zeichens aus einem Eingabestring in Java?
Die Klasse String
hat keine Methode zum Entfernen von Zeichen. Das folgende Beispiel zeigt, wie die Methode replace()
verwendet wird, um einen neuen String ohne das angegebene Zeichen zu erstellen:
String str1 = "abcdABCDabcdABCD";
str1 = str1.replace("a", "");
System.out.println(str1); // bcdABCDbcdABCD
String ist in Java unveränderlich. Alle Methoden zur Zeichenkettenmanipulation geben eine neue Zeichenkette zurück, weshalb Sie sie einer anderen Variable zuweisen müssen. Erfahren Sie mehr über das Entfernen von Zeichen aus einer Zeichenkette in Java.
26. Wie erhalten Sie in Java einzelne Zeichen und deren Anzahl in einem String?
Sie können das Zeichenarray aus dem String erstellen. Iterieren Sie dann darüber und erstellen Sie eine HashMap
mit dem Zeichen als Schlüssel und der Anzahl als Wert. Der folgende Beispielcode zeigt, wie man die Zeichen eines Strings extrahiert und zählt:
String str1 = "abcdABCDabcd";
char[] chars = str1.toCharArray();
Map<Character, Integer> charsCount = new HashMap<>();
for (char c : chars) {
if (charsCount.containsKey(c)) {
charsCount.put(c, charsCount.get(c) + 1);
} else
charsCount.put(c, 1);
}
System.out.println(charsCount); // {a=2, A=1, b=2, B=1, c=2, C=1, d=2, D=1}
27. Können Sie programmatisch beweisen, dass ein String
-Objekt in Java unveränderlich ist?
Der folgende Beispielcode zeigt, wie man beweisen kann, dass ein String
-Objekt unveränderlich ist, und die Kommentare im Code erklären jeden Schritt:
String s1 = "Java"; // "Java" String im Pool erstellt und Referenz s1 zugewiesen
String s2 = s1; // s2 hat ebenfalls die gleiche Referenz zu "Java" im Pool
System.out.println(s1 == s2); // Nachweis, dass s1 und s2 die gleiche Referenz haben
s1 = "Python";
// s1-Wert wurde oben geändert, wie kann also String unveränderlich sein?
// In obigem Fall wurde ein neuer String "Python" im Pool erstellt
// s1 verweist nun auf den neuen String im Pool
// ABER der originale String "Java" ist immer noch unverändert und verbleibt im Pool
// s2 verweist weiterhin auf den originalen String "Java" im Pool
// Nachweis, dass s1 und s2 unterschiedliche Referenzen haben
System.out.println(s1 == s2);
System.out.println(s2);
// gibt "Java" aus und bestätigt somit, dass der ursprüngliche String unverändert ist, daher ist String unveränderlich
28. Können Sie Code schreiben, um Vererbung in Java zu zeigen?
Der folgende Beispielcode zeigt, wie das Schlüsselwort extends
verwendet wird, um eine Unterklasse der Klasse Animal
zu erstellen. Die neue Klasse Cat
erbt die Variable von der Klasse Animal
und fügt mehr Code hinzu, der nur zur Klasse Cat
gehört.
class Animal {
String color;
}
class Cat extends Animal {
void meow() {
System.out.println("Meow");
}
}
29. Wie zeigt man ein Diamantenproblem mit mehrfacher Vererbung in Java?
Das Diamantenproblem tritt auf, wenn eine Klasse von mehreren Klassen erbt und Unklarheit darüber besteht, welche Methode aus welcher Klasse ausgeführt werden soll. Java erlaubt keine mehrfache Vererbung, um das Diamantenproblem zu vermeiden, wie im folgenden Beispiel illustriert:
interface I {
void foo();
}
class A implements I {
public void foo() {}
}
class B implements I {
public void foo() {}
}
class C extends A, B { // kompiliert nicht
public void bar() {
super.foo();
}
}
30. Wie illustriert man ein Try-Catch-Beispiel in Java?
Der folgende Beispielcode zeigt ein Try-Catch-Beispiel:
try {
FileInputStream fis = new FileInputStream("test.txt");
} catch(FileNotFoundException e) {
e.printStackTrace();
}
Von Java 7 an können Sie auch mehrere Ausnahmen in einem einzelnen Catch-Block abfangen, wie im folgenden Beispiel gezeigt. Es ist nützlich, wenn Sie den gleichen Code in allen Catch-Blöcken haben.
public static void foo(int x) throws IllegalArgumentException, NullPointerException {
// etwas Code
}
public static void main(String[] args) {
try {
foo(10);
} catch (IllegalArgumentException | NullPointerException e) {
System.out.println(e.getMessage());
}
}
31. Schreiben Sie ein Java-Programm, um eine NullPointerException
anzuzeigen.
Wenn Sie eine Funktion mit null
aufrufen, wird eine NullPointerException
ausgelöst, wie im folgenden Beispielcode gezeigt:
public static void main(String[] args) {
printString(null, 3);
}
static void printString(String s, int count) {
for (int i = 0; i < count; i++) {
System.out.println(s.toUpperCase()); // Exception in thread "main" java.lang.NullPointerException
}
}
Sie sollten eine Nullprüfung für eine frühzeitige Validierung haben, wie im folgenden Beispielcode gezeigt:
static void printString(String s, int count) {
if (s == null) return;
for (int i = 0; i < count; i++) {
System.out.println(s.toUpperCase());
}
}
Sie können auch eine IllegalArgumentException
basierend auf den Projektanforderungen werfen.
32. Wie erstellen Sie einen Datensatz in Java?
Records wurden als Standardfunktion in Java 16 hinzugefügt. Records ermöglichen es Ihnen, eine POJO-Klasse mit minimalem Code zu erstellen. Records generieren automatisch den hashCode()
, equals()
, Getter-Methoden und den toString()
-Methoden-Code für die Klasse. Records sind final und erweitern implizit die java.lang.Record
-Klasse. Der folgende Beispielcode zeigt eine Möglichkeit, einen Datensatz zu erstellen:
import java.util.Map;
public record EmpRecord(int id, String name, long salary, Map<String, String> addresses) {
}
Erfahren Sie mehr über Records in Java. Für Details zu POJO siehe Plain old Java object auf Wikipedia.
33. Wie erstellt man Textblöcke in Java?
Java 15 hat die Funktion der Textblöcke hinzugefügt. Sie können mehrzeilige Zeichenketten mit Textblöcken erstellen. Die mehrzeilige Zeichenkette muss innerhalb eines Paars von dreifachen doppelten Anführungszeichen geschrieben werden, wie im folgenden Beispiel gezeigt:
String textBlock = """
Hi
Hello
Yes""";
Es ist dasselbe wie das Erstellen einer Zeichenkette, wie zum Beispiel Hi\\nHello\\nYes
.
34. Zeigen Sie ein Beispiel für Switch-Ausdrücke und mehrfache Fall-Anweisungen in Java.
Die Switch-Ausdrücke wurden als Standardfunktion in Java 14 hinzugefügt. Die folgenden Beispiele zeigen Switch-Ausdrücke sowie mehrfache Fall-Anweisungen:
int choice = 2;
int x = switch (choice) {
case 1, 2, 3:
yield choice;
default:
yield -1;
};
System.out.println("x = " + x); // x = 2
Sie können auch Lambda-Ausdrücke in Switch-Ausdrücken verwenden.
String day = "TH";
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if (day.isEmpty())
yield "Please insert a valid day.";
else
yield "Looks like a Sunday.";
}
};
System.out.println(result); // TTH
35. Wie kompiliert und führt man eine Java-Klasse von der Befehlszeile aus?
Dieses Beispiel bezieht sich auf die folgende Java-Datei:
public class Test {
public static void main(String args[]) {
System.out.println("Hi");
}
}
Sie können sie mit dem folgenden Befehl in Ihrem Terminal kompilieren:
- javac Test.java
Um die Klasse auszuführen, verwenden Sie den folgenden Befehl in Ihrem Terminal:
- java Test
Für die neueren Versionen wird der java
-Befehl das Programm auch kompilieren, wenn die Klassendatei nicht vorhanden ist. Wenn sich die Klasse in einem Paket wie com.example
befindet, sollte sie sich im Ordner com/example
befinden. Der Befehl zum Kompilieren und Ausführen lautet:
- java com/example/Test.java
Wenn Ihre Klasse zum Kompilieren und Ausführen zusätzliche JARs benötigt, können Sie die Option java -cp
verwenden. Zum Beispiel:
- java -cp .:~/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar com/example/Test.java
36. Wie erstellt man ein Enum in Java?
Das folgende Beispielcode zeigt, wie man ein grundlegendes Enum erstellt:
public enum ThreadStates {
START,
RUNNING,
WAITING,
DEAD;
}
ThreadStates
ist das Enum mit festen Konstantenfeldern START
, RUNNING
, WAITING
und DEAD
. Alle Enums erweitern implizit die Klasse java.lang.Enum
und implementieren die Schnittstellen Serializable
und Comparable
. Enums können auch Methoden haben. Erfahren Sie mehr über Enums in Java.
37. Wie verwenden Sie die Methode forEach()
in Java?
Die Methode forEach()
bietet eine Abkürzung, um eine Aktion auf allen Elementen eines Iterators auszuführen. Der folgende Beispielcode zeigt, wie Sie über die Listenelemente iterieren und sie ausdrucken können:
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Sie können die Methode forEach()
mit einem Lambda-Ausdruck verwenden, um den Code zu reduzieren, wie im folgenden Beispielcode gezeigt:
List<String> list = new ArrayList<>();
list.forEach(System.out::print);
38. Wie schreiben Sie ein Interface mit default
und static
Methoden?
Java 8 führte Standard- und statische Methoden in Schnittstellen ein. Dies überbrückte die Kluft zwischen Schnittstellen und abstrakten Klassen. Der folgende Beispielcode zeigt eine Möglichkeit, eine Schnittstelle mit den Methoden default
und static
zu schreiben:
public interface Interface1 {
// reguläre abstrakte Methode
void method1(String str);
default void log(String str) {
System.out.println("I1 logging::" + str);
}
static boolean isNull(String str) {
System.out.println("Interface Null Check");
return str == null ? true : "".equals(str) ? true : false;
}
}
Erfahren Sie mehr über default
und static
Methoden in Schnittstellen in Java 8-Schnittstellenänderungen.
39. Wie erstellen Sie eine funktionale Schnittstelle?
Eine Schnittstelle mit genau einer abstrakten Methode wird als funktionale Schnittstelle bezeichnet. Der Hauptvorteil funktionaler Schnittstellen besteht darin, dass Sie Lambda-Ausdrücke verwenden können, um sie zu instanziieren, und auf die Verwendung sperriger anonymer Klassenimplementierungen verzichten können. Die Annotation @FunctionalInterface
zeigt eine funktionale Schnittstelle an, wie im folgenden Beispielcode gezeigt:
@FunctionalInterface
interface Foo {
void test();
}
40. Zeigen Sie ein Beispiel für die Verwendung von Lambda-Ausdrücken in Java.
Runnable
ist ein ausgezeichnetes Beispiel für eine funktionale Schnittstelle. Sie können Lambda-Ausdrücke verwenden, um einen ausführbaren Code zu erstellen, wie im folgenden Beispiel:
Runnable r1 = () -> System.out.println("My Runnable");
41. Zeigen Sie Beispiele für Überladen und Überschreiben in Java.
Wenn eine Klasse zwei oder mehr Methoden mit dem gleichen Namen hat, werden sie als überladene Methoden bezeichnet. Der folgende Beispielcode zeigt eine überladene Methode namens print
:
class Foo {
void print(String s) {
System.out.println(s);
}
void print(String s, int count) {
while (count > 0) {
System.out.println(s);
count--;
}
}
}
Wenn eine Methode der Oberklasse auch in der Kindklasse implementiert ist, wird dies als Überschreiben bezeichnet. Der folgende Beispielcode zeigt, wie die Methode printname()
annotiert wird, die in beiden Klassen implementiert ist:
class Base {
void printName() {
System.out.println("Base Class");
}
}
class Child extends Base {
@Override
void printName() {
System.out.println("Child Class");
}
}
Erfahren Sie mehr über Überschreiben und Überladen in Java.
42.-49. Erraten Sie die Ausgabe
Testen Sie sich, indem Sie die Ausgabe der folgenden Code-Snippets erraten.
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2 is:" + s1 == s2);
Output
false
Die Ausgabe der gegebenen Anweisung ist false
, weil der +
-Operator eine höhere Präzedenz als der ==
-Operator hat. Daher wird der gegebene Ausdruck zu “s1 == s2 ist:abc” == “abc”
ausgewertet, was false
ergibt.
String s3 = "JournalDev";
int start = 1;
char end = 5;
System.out.println(s3.substring(start, end));
Output
ourn
Die Ausgabe der gegebenen Anweisung ist `ourn`. Das erste Zeichen wird automatisch in `int` umgewandelt. Danach, da der erste Zeichenindex 0 ist, wird es von `o` aus gedruckt bis zum Zeichen `n`. Beachten Sie, dass die Methode `String substring` einen Teilstring erstellt, der bei Index `start` beginnt und bis zum Zeichen bei Index `end – 1` reicht.
HashSet shortSet = new HashSet();
for (short i = 0; i < 100; i++) {
shortSet.add(i);
shortSet.remove(i - 1);
}
System.out.println(shortSet.size());
Output
100
Die Größe des `shortSet` beträgt `100`. Die Autoboxing-Funktion in Java bedeutet, dass der Ausdruck `i`, der den primitiven Typ `short` hat, in ein `Short`-Objekt umgewandelt wird. Ebenso wird der Ausdruck `i – 1` mit dem primitiven Typ `int` autoboxed zu einem `Integer`-Objekt. Da es kein `Integer`-Objekt im `HashSet` gibt, wird nichts entfernt und die Größe beträgt `100`.
try {
if (flag) {
while (true) {
}
} else {
System.exit(1);
}
} finally {
System.out.println("In Finally");
}
Output
Keine Ausgabe. Dieser Code führt zu einer Endlosschleife, wenn die Flagge `true` ist, und das Programm wird beendet, wenn die Flagge `false` ist. Der `finally`-Block wird niemals erreicht.
String str = null;
String str1="abc";
System.out.println(str1.equals("abc") | str.equals(null));
Output
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "<local1>" is null
Die gegebene Druckanweisung wirft eine `java.lang.NullPointerException`, da der logische Operator `OR` beide Literale auswertet, bevor das Ergebnis zurückgegeben wird. Da `str` `null` ist, wird die Methode `.equals()` eine Ausnahme werfen. Es ist immer ratsam, Kurzschlusslogik-Operatoren wie `||` und `&&` zu verwenden, die die Literalwerte von links nach rechts auswerten. In diesem Fall würde es aufgrund des ersten Literalwerts, der `true` zurückgeben würde, die Auswertung des zweiten Literals überspringen.
String x = "abc";
String y = "abc";
x.concat(y);
System.out.print(x);
Output
abc
Die x.concat(y)
-Methode erstellt einen neuen String, wird aber nicht an x
zugewiesen, daher ändert sich der Wert von x
nicht.
public class MathTest {
public void main(String[] args) {
int x = 10 * 10 - 10;
System.out.println(x);
}
}
Output
Error: Main method is not static in class MathTest, please define the main method as:
public static void main(String[] args)
Obwohl es zunächst so aussieht, als ob diese Frage die Reihenfolge der Ausführung der mathematischen Operatoren betrifft, handelt es sich eigentlich darum zu bemerken, dass die main-Methode nicht als static
deklariert wurde.
public class Test {
public static void main(String[] args) {
try {
throw new IOException("Hello");
} catch(IOException | Exception e) {
System.out.println(e.getMessage());
}
}
}
Output
Test.java:5: error: cannot find symbol
throw new IOException("Hello");
^
symbol: class IOException
location: class Test
Test.java:6: error: cannot find symbol
}catch(IOException | Exception e) {
^
symbol: class IOException
location: class Test
2 errors
Dieser Code führt zu einem Kompilierungsfehler. Die Ausnahme IOException
wird bereits durch das alternative Exception
abgefangen.
50. Finde 5 Fehler im folgenden Code-Schnipsel.
package com.digitalocean.programming-interviews;
public class String Programs {
static void main(String[10] args) {
String s = "abc"
System.out.println(s);
}
}
Answers
- Der Paketname darf keine Bindestriche enthalten.
- Der Klassenname darf keine Leerzeichen enthalten.
- Die Hauptmethode ist nicht als
public
deklariert, daher wird sie nicht ausgeführt. - Das Hauptmethodenargument sollte nicht die Größe angeben.
- Im String fehlt das Semikolon in der Definition.
Fazit
Diese Sammlung von 50 Java-Programmierungsinterviewfragen umfasst Fragen vom Anfänger- bis zum Expertenniveau, um Sie auf Ihr Interview vorzubereiten.
Empfohlene Lektüre:
Source:
https://www.digitalocean.com/community/tutorials/java-programming-interview-questions