Inleiding
Als je solliciteert voor een Java programmeerrol, dan zullen waarschijnlijk je programmeervaardigheden getest worden. Of je nu een beginner bent in Java of een ervaren programmeur, dit artikel biedt enkele veelvoorkomende Java interviewvragen en antwoorden om je voor te bereiden.
1. Hoe keer je een string om in Java?
Er is geen reverse()
hulpmethode in de String
klasse. Je kunt echter een karakterarray maken van de string en deze vervolgens van het einde naar het begin doorlopen. Je kunt de karakters toevoegen aan een string builder en uiteindelijk de omgekeerde string retourneren.
Het volgende voorbeeld laat zien hoe je een string kunt omkeren:
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();
}
}
Bonuspunten voor het toevoegen van een null
-controle in de methode en het gebruik van StringBuilder
voor het toevoegen van de karakters. Let op dat de indexering in Java begint bij 0, dus je moet starten bij chars.length - 1
in de for
-lus.
2. Hoe wissel je twee getallen uit zonder een derde variabele te gebruiken in Java?
Het verwisselen van getallen zonder een derde variabele te gebruiken is een proces in drie stappen dat beter gevisualiseerd kan worden in code:
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)
Het volgende voorbeeld toont een manier om de methode voor het verwisselen van getallen te implementeren:
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);
}
}
De uitvoer toont aan dat de integerwaarden verwisseld zijn:
Outputa is 10 and b is 20
After swapping, a is 20 and b is 10
3. Schrijf een Java-programma om te controleren of een klinker aanwezig is in een string.
Het volgende voorbeeld toont hoe je een reguliere expressie kunt gebruiken om te controleren of de string klinkers bevat:
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. Schrijf een Java-programma om te controleren of het gegeven getal een priemgetal is.
Je kunt een programma schrijven om het gegeven getal n
te delen door een getal van 2 tot n
/2 en de rest te controleren. Als de rest 0 is, is het geen priemgetal. Het volgende voorbeeldcode laat zien hoe je kunt controleren of een gegeven getal een priemgetal is:
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;
}
}
Hoewel dit programma werkt, is het niet erg geheugen- en tijdefficiënt. Overweeg dat, voor een gegeven getal N
, als er een priemgetal M
is tussen 2
en √N
(wortel van N) dat het gelijkmatig verdeelt, dan is N
geen priemgetal.
5. Schrijf een Java-programma om een Fibonacci-reeks af te drukken met behulp van recursie.
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,
Je kunt ook recursie gebruiken om een Fibonacci-reeks af te drukken, omdat het Fibonacci-getal wordt gegenereerd door de vorige twee getallen in de reeks toe te voegen:
F(N) = F(N-1) + F(N-2)
De volgende voorbeeldklasse toont hoe je recursie kunt gebruiken om een Fibonacci-reeks van 10 getallen te berekenen:
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. Hoe controleer je of een lijst met gehele getallen alleen oneven getallen bevat in Java?
Je kunt een for
-lus gebruiken en controleren of elk element oneven is:
public static boolean onlyOddNumbers(List<Integer> list) {
for (int i : list) {
if (i % 2 == 0)
return false;
}
return true;
}
Als de lijst groot is, kun je een parallelle stream gebruiken voor snellere verwerking, zoals getoond in het volgende voorbeeldcode:
public static boolean onlyOddNumbers(List<Integer> list) {
return list
.parallelStream() // parallelle stream voor snellere verwerking
.anyMatch(x -> x % 2 != 0); // retourneer zodra een van de elementen aan de voorwaarde voldoet
}
Om meer te weten te komen over de wiskunde achter het bepalen of een getal oneven is, raadpleeg de Modulo-operatie op Wikipedia.
7. Hoe controleer je of een string een palindroom is in Java?
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. Hoe verwijder je spaties uit een string in Java?
Het volgende voorbeeld toont een manier om spaties uit een tekenreeks te verwijderen met behulp van de Character.isWhitespace()
-methode:
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();
}
Lees meer over het verwijderen van spaties en andere tekens uit een tekenreeks in Java.
9. Hoe verwijder je voorloop- en achterloopspaties uit een tekenreeks in Java?
De klasse String
bevat twee methoden om voorloop- en achterloopspaties te verwijderen: trim()
en strip()
. De strip()
-methode is toegevoegd aan de klasse String
in Java 11. De strip()
-methode gebruikt de Character.isWhitespace()
-methode om te controleren of het karakter een spatie is. Deze methode gebruikt Unicode-codepunten, terwijl de trim()
-methode elk karakter identificeert met een codepuntwaarde kleiner dan of gelijk aan U+0020
als een spatiekarakter.
De strip()
-methode is de aanbevolen manier om spaties te verwijderen omdat het de Unicode-standaard gebruikt. Het volgende voorbeeld toont hoe de strip()
-methode wordt gebruikt om spaties te verwijderen:
String s = " abc def\t";
s = s.strip();
System.out.println(s);
Omdat String
onveranderlijk is, moet je de uitvoer van strip()
toewijzen aan de tekenreeks.
10. Hoe sorteert u een array in Java?
De hulpprogrammaklasse Arrays
heeft veel overbelaste sort()
-methoden om primitieve en objectarrays te sorteren. Als u een primitieve array op natuurlijke wijze sorteert, kunt u de methode Arrays.sort()
gebruiken, zoals getoond in het volgende voorbeeld:
int[] array = {1, 2, 3, -1, -2, 4};
Arrays.sort(array);
System.out.println(Arrays.toString(array));
Als u echter een array van objecten wilt sorteren, moet het object de interface Comparable
implementeren. Als u de sorteercriteria wilt specificeren, kunt u de Comparator
doorgeven voor de sorte logica. Lees meer over Comparable en Comparator in Java.
11. Hoe creëert u programmatisch een impasse in Java?
Impasse is een scenario in een multithreading Java-omgeving waar twee of meer threads voor altijd zijn geblokkeerd. De impassesituatie ontstaat met minimaal twee threads. Het volgende voorbeeldcode creëert een impasse-scenario:
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 drie threads zullen in staat zijn om een vergrendeling op het eerste object te verkrijgen. Echter, ze maken gebruik van gedeelde bronnen en worden gestart op een manier dat ze oneindig blijven wachten om de vergrendeling op het tweede object te verkrijgen. Je kunt de Java thread dump gebruiken om de deadlocks te detecteren. Leer meer over deadlock in Java.
12. Hoe kun je de faculteit van een integer vinden in Java?
De faculteit van een integer wordt berekend door alle getallen van 1 tot het gegeven getal met elkaar te vermenigvuldigen:
F(n) = F(1)*F(2)...F(n-1)*F(n)
Het volgende voorbeeldcode toont hoe je recursie kunt gebruiken om de faculteit van een integer te vinden:
public static long factorial(long n) {
if (n == 1)
return 1;
else
return (n * factorial(n - 1));
}
13. Hoe keer je een gelinkte lijst om in Java?
LinkedList descendingIterator()
retourneert een iterator die door de elementen in omgekeerde volgorde loopt. Het volgende voorbeeldcode toont hoe je deze iterator kunt gebruiken om een nieuwe gelinkte lijst te maken met elementen in omgekeerde volgorde:
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);
Leer meer over het omkeren van een gelinkte lijst vanuit het perspectief van gegevensstructuren en algoritmen.
14. Hoe implementeer je een binair zoekalgoritme in Java?
De array-elementen moeten gesorteerd zijn om een binair zoekalgoritme te implementeren. Het binair zoekalgoritme is gebaseerd op de volgende voorwaarden:
- Als de sleutel kleiner is dan het middelste element, moet je nu alleen in de eerste helft van de array zoeken.
- Als de sleutel groter is dan het middelste element, moet je alleen in de tweede helft van de array zoeken.
- Als de sleutel gelijk is aan het middelste element in de array, eindigt de zoekopdracht.
- Uiteindelijk, als de sleutel niet wordt gevonden in de hele array, moet het
-1
retourneren. Dit geeft aan dat het element niet aanwezig is.
Het volgende voorbeeldcode implementeert een binair zoekalgoritme:
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. Schrijf een Java-programma dat merge sort illustreert.
Merge sort is een van de meest efficiënte sorteeralgoritmen. Het werkt volgens het principe van “verdeel en heers”. Het is gebaseerd op het idee om een lijst op te splitsen in verschillende sublijsten totdat elke sublijst uit één element bestaat, en vervolgens die sublijsten op een manier samen te voegen die resulteert in een gesorteerde lijst. Het volgende voorbeeldcode laat zien hoe je merge sort kunt gebruiken:
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. Kun je een piramide van tekens maken in Java?
Patroonprogramma’s zijn een zeer populair onderwerp tijdens sollicitatiegesprekken. Dit type vraag wordt gebruikt om het logisch denkvermogen van de sollicitant te begrijpen. Raadpleeg Patroonprogramma’s voor piramides in Java voor voorbeelden van verschillende manieren om piramidepatronen te maken.
17. Schrijf een Java-programma dat controleert of twee arrays dezelfde elementen bevatten.
Om te controleren of twee arrays dezelfde elementen bevatten, moet je eerst een verzameling van elementen maken vanuit beide arrays, en vervolgens de elementen in deze verzamelingen vergelijken om te zien of er een element is dat niet aanwezig is in beide verzamelingen. Het volgende voorbeeldcode toont hoe je kunt controleren of twee arrays alleen gemeenschappelijke elementen bevatten:
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));
// als de grootte verschillend is, betekent dit dat er een verschil zal zijn
if (uniqueElements1.size() != uniqueElements2.size()) return false;
for (Object obj : uniqueElements1) {
// element niet aanwezig in beide?
if (!uniqueElements2.contains(obj)) return false;
}
return true;
}
}
Outputtrue
false
18. Hoe krijg je de som van alle elementen in een integer array in Java?
Je kunt een for
-lus gebruiken om over de array-elementen te itereren en ze toe te voegen om de uiteindelijke som te krijgen:
int[] array = { 1, 2, 3, 4, 5 };
int sum = 0;
for (int i : array)
sum += i;
System.out.println(sum);
19. Hoe vind je het op een na grootste getal in een array in Java?
Er zijn veel manieren om dit probleem op te lossen. Je kunt de array sorteren in natuurlijke oplopende volgorde en de op een na laatste waarde nemen. Echter, sorteren is een kostbare bewerking. Je kunt ook twee variabelen gebruiken om de op een na grootste waarde te vinden in een enkele iteratie, zoals getoond in het volgende voorbeeld:
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. Hoe schud je een array in Java?
Het volgende voorbeeldcode toont hoe je de klasse Random
kunt gebruiken om willekeurige indexnummers te genereren en de elementen te schudden:
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));
Je kunt de schudcode uitvoeren binnen een andere for
-lus om meerdere rondes te schudden.
21. Hoe kun je een string in een tekstbestand vinden in Java?
Het volgende voorbeeldcode toont hoe je de klasse Scanner
kunt gebruiken om de bestandsinhoud regel voor regel te lezen en vervolgens de String contains()
-methode kunt gebruiken om te controleren of de string aanwezig is in het bestand:
boolean findStringInFile(String filePath, String str) throws FileNotFoundException {
File file = new File(filePath);
Scanner scanner = new Scanner(file);
// lees het bestand regel voor regel
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.contains(str)) {
scanner.close();
return true;
}
}
scanner.close();
return false;
}
Merk op dat de voorbeeldcode ervan uitgaat dat de te zoeken string in het bestand geen nieuwe regel karakters bevat.
22. Hoe druk je een datum af in een specifiek formaat in Java?
De volgende voorbeeldcode toont hoe de klasse SimpleDateFormat
kan worden gebruikt om de datumstring te formatteren:
String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date); // 06-23-2020
Leer meer over de Java SimpleDateFormat.
23. Hoe kun je twee lijsten samenvoegen in Java?
De volgende voorbeeldcode toont hoe de methode addAll()
kan worden gebruikt om meerdere lijsten samen te voegen in Java:
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. Schrijf een Java-programma dat een HashMap sorteert op waarde.
HashMap
is geen geordende collectie. De volgende voorbeeldcode toont hoe de vermeldingen worden gesorteerd op basis van waarde en opgeslagen in een LinkedHashMap
, die de volgorde van invoeging behoudt:
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<>();
// verkrijg de invoer set
Set<Entry<String, Integer>> entrySet = scores.entrySet();
System.out.println(entrySet);
// maak een lijst aan omdat de set ongeordend is
List<Entry<String, Integer>> entryList = new ArrayList<>(entrySet);
System.out.println(entryList);
// sorteer de lijst op waarde
entryList.sort((x, y) -> x.getValue().compareTo(y.getValue()));
System.out.println(entryList);
// vul de nieuwe hash-map
for (Entry<String, Integer> e : entryList)
sortedByValue.put(e.getKey(), e.getValue());
return sortedByValue;
}
}
25. Hoe verwijder je alle voorkomens van een bepaald karakter uit een invoerstring in Java?
De klasse String
heeft geen methode om tekens te verwijderen. Het volgende voorbeeldcode laat zien hoe de methode replace()
kan worden gebruikt om een nieuwe string te maken zonder het opgegeven karakter:
String str1 = "abcdABCDabcdABCD";
str1 = str1.replace("a", "");
System.out.println(str1); // bcdABCDbcdABCD
String is onveranderlijk (immutable) in Java. Alle methoden voor stringmanipulatie retourneren een nieuwe string, daarom moet je deze toewijzen aan een andere variabele. Lees meer over het verwijderen van tekens uit een string in Java.
26. Hoe krijg je verschillende tekens en hun teller in een string in Java?
Je kunt de tekens array maken vanuit de string. Vervolgens kun je er doorheen itereren en een HashMap
maken met het teken als sleutel en hun teller als waarde. Het volgende voorbeeldcode toont hoe je de tekens van een string kunt extraheren en tellen:
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. Kun je programmatisch bewijzen dat een String
-object in Java onveranderlijk is?
De volgende voorbeeldcode toont hoe je kunt bewijzen dat een String
-object onveranderlijk is en de opmerkingen in de code leggen elke stap uit:
String s1 = "Java"; // Een "Java" String aangemaakt in de pool en referentie toegewezen aan s1
String s2 = s1; // s2 heeft ook dezelfde referentie naar "Java" in de pool
System.out.println(s1 == s2); // bewijs dat s1 en s2 dezelfde referentie hebben
s1 = "Python";
// de waarde van s1 is hierboven gewijzigd, dus hoe is String onveranderlijk?
// in het bovenstaande geval werd een nieuwe String "Python" aangemaakt in de pool
// s1 verwijst nu naar de nieuwe String in de pool
// MAAR, de oorspronkelijke String "Java" is nog steeds ongewijzigd en blijft in de pool
// s2 verwijst nog steeds naar de oorspronkelijke String "Java" in de pool
// bewijs dat s1 en s2 een verschillende referentie hebben
System.out.println(s1 == s2);
System.out.println(s2);
// print "Java" ter ondersteuning van het feit dat de oorspronkelijke String-waarde ongewijzigd is, vandaar dat String onveranderlijk is
28. Kun je wat code schrijven om overerving in Java te demonstreren?
De volgende voorbeeldcode toont hoe de extends
-sleutelwoord wordt gebruikt om een subklasse van de klasse Animal
te maken. De nieuwe klasse Cat
erft de variabele van de klasse Animal
en voegt meer code toe die alleen bij de klasse Cat
hoort.
class Animal {
String color;
}
class Cat extends Animal {
void meow() {
System.out.println("Meow");
}
}
29. Hoe toon je een diamantprobleem met meervoudige overerving in Java?
Het diamantprobleem doet zich voor wanneer een klasse erft van meerdere klassen en er ambiguïteit ontstaat over welke methode moet worden uitgevoerd. Java staat niet toe dat je van meerdere klassen erft om het diamantprobleem te vermijden, geïllustreerd door het volgende voorbeeld:
interface I {
void foo();
}
class A implements I {
public void foo() {}
}
class B implements I {
public void foo() {}
}
class C extends A, B { // compileert niet
public void bar() {
super.foo();
}
}
30. Hoe illustreer je een try-catch-voorbeeld in Java?
De volgende voorbeeldcode toont een voorbeeld van try-catch:
try {
FileInputStream fis = new FileInputStream("test.txt");
} catch(FileNotFoundException e) {
e.printStackTrace();
}
Vanaf Java 7 kun je ook meerdere uitzonderingen in één catch-blok opvangen, zoals getoond in het volgende voorbeeld. Het is handig wanneer je dezelfde code in alle catch-blokken hebt.
public static void foo(int x) throws IllegalArgumentException, NullPointerException {
// wat code
}
public static void main(String[] args) {
try {
foo(10);
} catch (IllegalArgumentException | NullPointerException e) {
System.out.println(e.getMessage());
}
}
31. Schrijf een Java-programma om een NullPointerException
te tonen.
Als je een functie aanroept op null
, zal het een NullPointerException
veroorzaken, zoals getoond in het volgende voorbeeldcode:
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
}
}
Je zou een null-check moeten hebben voor vroege validatie, zoals getoond in het volgende voorbeeldcode:
static void printString(String s, int count) {
if (s == null) return;
for (int i = 0; i < count; i++) {
System.out.println(s.toUpperCase());
}
}
Je kunt ook IllegalArgumentException
gooien op basis van de projectvereisten.
32. Hoe maak je een record in Java?
Records zijn toegevoegd als een standaardfunctie in Java 16. Records stellen je in staat om een POJO-klasse te maken met minimaal code. Records genereren automatisch hashCode()
, equals()
, getter-methoden en toString()
-methodecode voor de klasse. Records zijn final en breiden impliciet de klasse java.lang.Record
uit. Het volgende voorbeeldcode toont een manier om een record te maken:
import java.util.Map;
public record EmpRecord(int id, String name, long salary, Map<String, String> addresses) {
}
Leer meer over records in Java. Voor details over POJO, raadpleeg Plain old Java object op Wikipedia.
33. Hoe maak je tekstblokken in Java?
Java 15 voegde de functie voor tekstblokken toe. Je kunt meerregelige strings maken met tekstblokken. De meerregelige string moet worden geschreven tussen een paar drievoudige dubbele aanhalingstekens, zoals getoond in het volgende voorbeeld:
String textBlock = """
Hi
Hello
Yes""";
Hetzelfde als het maken van een string, zoals Hi\\nHello\\nYes
.
34. Toon een voorbeeld van switch-expressies en meerlaagse case-statements in Java.
Switch-expressies zijn toegevoegd als een standaardfunctie in Java 14. De volgende voorbeelden tonen switch-expressies en meerlaagse case-statements:
int choice = 2;
int x = switch (choice) {
case 1, 2, 3:
yield choice;
default:
yield -1;
};
System.out.println("x = " + x); // x = 2
Je kunt ook lambda-expressies gebruiken in switch-expressies.
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. Hoe compileer en voer je een Java-klasse uit vanaf de commandoregel?
Deze voorbeelden verwijzen naar het volgende Java-bestand:
public class Test {
public static void main(String args[]) {
System.out.println("Hi");
}
}
Je kunt het compileren met de volgende opdracht in je terminal:
- javac Test.java
Om de klasse uit te voeren, gebruik je de volgende opdracht in je terminal:
- java Test
Voor recente releases zal de java
-opdracht ook het programma compileren als het klassebestand niet aanwezig is. Als de klasse zich in een pakket bevindt, zoals com.example
, moet deze zich binnen de map com/example
bevinden. De opdracht om te compileren en uit te voeren is:
- java com/example/Test.java
Als je klasse enkele extra JAR-bestanden nodig heeft om te compileren en uit te voeren, kun je de java -cp
-optie gebruiken. Bijvoorbeeld:
- java -cp .:~/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar com/example/Test.java
36. Hoe maak je een enum in Java?
Het volgende voorbeeldcode toont hoe je een basisenum maakt:
public enum ThreadStates {
START,
RUNNING,
WAITING,
DEAD;
}
ThreadStates
is het enum met vaste constante velden START
, RUNNING
, WAITING
, en DEAD
. Alle enums breiden impliciet de klasse java.lang.Enum
uit en implementeren de interfaces Serializable
en Comparable
. Een enum kan ook methoden hebben. Leer meer over enums in Java.
37. Hoe gebruik je de forEach()
-methode in Java?
De forEach()
-methode biedt een snelkoppeling om een actie uit te voeren op alle elementen van een iterable. Het volgende voorbeeld laat zien hoe je over de lijstelementen kunt itereren en ze kunt afdrukken:
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Je kunt de forEach()
-methode gebruiken met een lambda-expressie om de grootte van de code te verminderen, zoals te zien is in het volgende voorbeeld:
List<String> list = new ArrayList<>();
list.forEach(System.out::print);
38. Hoe schrijf je een interface met default
en static
methode?
Java 8 introduceerde standaard- en statische methoden in interfaces. Dit overbrugde de kloof tussen interfaces en abstracte klassen. Het volgende voorbeeld toont een manier om een interface te schrijven met de default
– en static
-methoden:
public interface Interface1 {
// reguliere abstracte 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;
}
}
Lees meer over default
– en static
-methoden in interfaces in Java 8 interface changes.
39. Hoe maak je een functionele interface?
Een interface met precies één abstracte methode wordt een functionele interface genoemd. Het belangrijkste voordeel van functionele interfaces is dat je lambda-expressies kunt gebruiken om ze te instantiëren en het gebruik van omvangrijke anonieme klasse-implementatie kunt vermijden. De @FunctionalInterface
-annotatie geeft een functionele interface aan, zoals getoond in het volgende voorbeeld:
@FunctionalInterface
interface Foo {
void test();
}
40. Geef een voorbeeld van het gebruik van lambda-expressies in Java.
Runnable
is een uitstekend voorbeeld van een functionele interface. U kunt lambda-uitdrukkingen gebruiken om een uitvoerbare code te maken, zoals getoond in het volgende voorbeeld:
Runnable r1 = () -> System.out.println("My Runnable");
41. Toon voorbeelden van overbelasting en overschrijven in Java.
Wanneer een klasse twee of meer methoden met dezelfde naam heeft, worden ze overbelaste methoden genoemd. Het volgende voorbeeld laat een overbelaste methode genaamd print
zien:
class Foo {
void print(String s) {
System.out.println(s);
}
void print(String s, int count) {
while (count > 0) {
System.out.println(s);
count--;
}
}
}
Als een methode van de superklasse ook geïmplementeerd is in de subklasse, wordt dit overschrijven genoemd. Het volgende voorbeeld laat zien hoe u de methode printname()
kunt annoteren die is geïmplementeerd in beide klassen:
class Base {
void printName() {
System.out.println("Base Class");
}
}
class Child extends Base {
@Override
void printName() {
System.out.println("Child Class");
}
}
Leer meer over overschrijven en overbelasting in Java.
42.-49. Raad de output
Test uzelf door de output van de volgende codefragmenten te raden.
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2 is:" + s1 == s2);
Output
false
De output van de gegeven verklaring is false
omdat de +
-operator een hogere prioriteit heeft dan de ==
-operator. Dus de gegeven expressie wordt geëvalueerd als “s1 == s2 is:abc” == “abc”
, wat false
is.
String s3 = "JournalDev";
int start = 1;
char end = 5;
System.out.println(s3.substring(start, end));
Output
ourn
De uitvoer van de gegeven verklaring is ourn
. Het eerste karakter wordt automatisch omgezet naar int
. Vervolgens, aangezien de index van het eerste karakter 0 is, zal het beginnen vanaf o
en doorgaan tot n
. Merk op dat de methode String substring
een substring creëert die begint bij index start
en zich uitstrekt tot het karakter bij index end - 1
.
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
De grootte van de shortSet
is 100
. De autoboxing-functie in Java betekent dat de expressie i
, die het primitieve type short
heeft, wordt geconverteerd naar een object van het type Short
. Op dezelfde manier heeft de expressie i - 1
het primitieve type int
en wordt geautoboxed naar een object van het type Integer
. Aangezien er geen object van het type Integer
in de HashSet
zit, wordt er niets verwijderd en blijft de grootte 100
.
try {
if (flag) {
while (true) {
}
} else {
System.exit(1);
}
} finally {
System.out.println("In Finally");
}
Output
Geen uitvoer. Deze code resulteert in een oneindige lus als de vlag true
is, en het programma wordt afgesloten als de vlag false
is. Het finally
-blok zal nooit worden bereikt.
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
De opgegeven printfunctie zal een java.lang.NullPointerException
veroorzaken omdat de logische operator OR
beide literals evalueert voordat het resultaat wordt geretourneerd. Aangezien str
null
is, zal de methode .equals()
een uitzondering veroorzaken. Het is altijd raadzaam om kortsluitingslogische operatoren te gebruiken, zoals ||
en &&
, die de letterlijke waarden van links naar rechts evalueren. In dit geval zou het eerste literal true
retourneren, waardoor de evaluatie van het tweede literal wordt overgeslagen.
String x = "abc";
String y = "abc";
x.concat(y);
System.out.print(x);
Output
abc
De x.concat(y)
creëert een nieuwe string maar wordt niet toegewezen aan x
, dus de waarde van x
verandert niet.
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)
Hoewel het misschien lijkt alsof deze vraag gaat over de volgorde van uitvoering van de wiskundige operatoren, gaat de vraag eigenlijk over het opmerken dat de hoofdmethode niet is gedeclareerd als static
.
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
Deze code leidt tot een compilefout. De uitzondering IOException
wordt al afgehandeld door de alternatieve Exception
.
50. Zoek 5 fouten in onderstaande codefragment.
package com.digitalocean.programming-interviews;
public class String Programs {
static void main(String[10] args) {
String s = "abc"
System.out.println(s);
}
}
Answers
- De pakketnaam mag geen streepjes bevatten.
- De klassenaam mag geen spaties bevatten.
- De hoofdmethode is niet
public
, dus zal deze niet worden uitgevoerd. - Het argument van de hoofdmethode mag de grootte niet specificeren.
- De puntkomma ontbreekt in de stringdefinitie.
Conclusie
Deze verzameling van 50 Java-programmeerinterviewvragen omvat vragen van beginner tot expertniveau, om je voor te bereiden op je sollicitatiegesprek.
Aanbevolen lectuur:
Source:
https://www.digitalocean.com/community/tutorials/java-programming-interview-questions