Le Prime 50 Domande per Colloqui di Programmazione Java

Introduzione

Se stai facendo un colloquio per un ruolo di programmazione Java, è probabile che le tue competenze di codifica verranno testate. Che tu sia un principiante in Java o un programmatore esperto, questo articolo fornisce alcune comuni domande e risposte per il colloquio di lavoro Java per aiutarti a prepararti.

1. Come si inverte una stringa in Java?

Non c’è un metodo di utilità reverse() nella classe String. Tuttavia, è possibile creare un array di caratteri dalla stringa e quindi iterarlo dalla fine all’inizio. È possibile aggiungere i caratteri a un costruttore di stringhe e infine restituire la stringa invertita.

L’esempio di codice seguente mostra un modo per invertire una stringa:

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();
	}

}

Punti bonus per l’aggiunta di controllo null nel metodo e l’utilizzo di StringBuilder per aggiungere i caratteri. Si noti che l’indicizzazione in Java inizia da 0, quindi è necessario iniziare da chars.length - 1 nel ciclo for.

2. Come si scambiano due numeri senza usare una terza variabile in Java?

Lo scambio di numeri senza utilizzare una terza variabile è un processo in tre fasi che è meglio visualizzato nel codice:

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)

Il seguente codice di esempio mostra un modo per implementare il metodo di scambio numerico:

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);
    }

}

L’output mostra che i valori interi sono stati scambiati:

Output
a is 10 and b is 20 After swapping, a is 20 and b is 10

3. Scrivi un programma Java per verificare se una vocale è presente in una stringa.

Il seguente codice di esempio mostra come utilizzare un’espressione regolare per verificare se la stringa contiene vocali:

public class StringContainsVowels {

	public static void main(String[] args) {
		System.out.println(stringContainsVowels("Hello")); // vero
		System.out.println(stringContainsVowels("TV")); // falso
	}

	public static boolean stringContainsVowels(String input) {
		return input.toLowerCase().matches(".*[aeiou].*");
	}

}

4. Scrivi un programma Java per verificare se il numero dato è un numero primo.

Puoi scrivere un programma per dividere il numero dato n per un numero da 2 a n/2 e controllare il resto. Se il resto è 0, allora non è un numero primo. Il codice di esempio seguente mostra un modo per verificare se un dato numero è un numero primo:

public class PrimeNumberCheck {

	public static void main(String[] args) {
		System.out.println(isPrime(19)); // vero
		System.out.println(isPrime(49)); // falso
	}

	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;
	}

}

Sebbene questo programma funzioni, non è molto efficiente in termini di memoria e tempo. Considera che, per un dato numero N, se c’è un numero primo M tra 2 e √N (radice quadrata di N) che lo divide uniformemente, allora N non è un numero primo.

Scrivi un programma Java per stampare una sequenza di Fibonacci utilizzando la ricorsione.

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);
	}

}
Output
0, 1, 1, 2, 3, 5, 8, 13, 21, 34,

Puoi anche usare la ricorsione per stampare una sequenza di Fibonacci, poiché il numero di Fibonacci è generato aggiungendo i due numeri precedenti nella sequenza:

F(N) = F(N-1) + F(N-2)

La seguente classe di esempio mostra come utilizzare la ricorsione per calcolare una sequenza di Fibonacci lunga 10 numeri:

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) + " ");
    	}
  	}

}
Output
A Fibonacci sequence of 10 numbers: 0 1 1 2 3 5 8 13 21 34

6. Come verificare se una lista di numeri interi contiene solo numeri dispari in Java?

Puoi utilizzare un ciclo for e verificare se ogni elemento è dispari:

public static boolean onlyOddNumbers(List<Integer> list) {
	for (int i : list) {
		if (i % 2 == 0)
			return false;
	}

	return true;
}

Se la lista è grande, puoi utilizzare un parallel stream per un elaborazione più veloce, come mostrato nel seguente codice di esempio:

public static boolean onlyOddNumbers(List<Integer> list) {
	return list
			.parallelStream() // parallel stream per un elaborazione più veloce
			.anyMatch(x -> x % 2 != 0); // restituisci appena un elemento soddisfa la condizione
}

Per saperne di più sulla matematica alla base della determinazione se un numero intero è dispari, consulta l’operazione di modulo su Wikipedia.

7. Come verificare se una stringa è un palindromo 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. Come rimuovere gli spazi da una stringa in Java?

Il codice di esempio seguente mostra un modo per rimuovere gli spazi da una stringa utilizzando il metodo Character.isWhitespace():

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();
}

Per saperne di più sulla rimozione degli spazi e altri caratteri da una stringa in Java.

9. Come si rimuovono gli spazi iniziali e finali da una stringa in Java?

La classe String contiene due metodi per rimuovere spazi iniziali e finali: trim() e strip(). Il metodo strip() è stato aggiunto alla classe String in Java 11. Il metodo strip() utilizza il metodo Character.isWhitespace() per verificare se il carattere è uno spazio bianco. Questo metodo utilizza i punti codice Unicode, mentre il metodo trim() identifica qualsiasi carattere con un valore del punto codice inferiore o uguale a U+0020 come carattere spazio bianco.

Il metodo strip() è il modo consigliato per rimuovere gli spazi bianchi perché utilizza lo standard Unicode. Il codice di esempio seguente mostra come utilizzare il metodo strip() per rimuovere gli spazi bianchi:

String s = "  abc  def\t";
		
s = s.strip();
		
System.out.println(s);

Poiché String è immutabile, è necessario assegnare l’output di strip() alla stringa.

10. Come si ordina un array in Java?

La classe di utilità Arrays dispone di molti metodi sovraccaricati sort() per ordinare array di tipi primitivi e di oggetti. Se si sta ordinando un array primitivo nell’ordine naturale, è possibile utilizzare il metodo Arrays.sort(), come mostrato nell’esempio seguente:

int[] array = {1, 2, 3, -1, -2, 4};

Arrays.sort(array);

System.out.println(Arrays.toString(array));

Tuttavia, se si desidera ordinare un array di oggetti, l’oggetto deve implementare l’interfaccia Comparable. Se si desidera specificare i criteri di ordinamento, è possibile passare il Comparator per la logica di ordinamento. Scopri di più su Comparable e Comparator in Java.

11. Come si crea uno scenario di deadlock programmato in Java?

Il deadlock è uno scenario in un ambiente Java multithreading in cui due o più thread sono bloccati per sempre. La situazione di deadlock si verifica con almeno due thread. Il seguente codice di esempio crea uno scenario di deadlock:

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();
        }
    }

}

Tutti e tre i thread saranno in grado di acquisire un blocco sul primo oggetto. Tuttavia, stanno utilizzando risorse condivise e vengono avviati in modo tale da continuare ad attendere indefinitamente per acquisire il blocco sul secondo oggetto. È possibile utilizzare il dump dei thread Java per rilevare i deadlock. Per saperne di più su deadlock in Java.

12. Come si può trovare il fattoriale di un intero in Java?

Il fattoriale di un intero viene calcolato moltiplicando tutti i numeri da 1 al numero dato:

F(n) = F(1)*F(2)...F(n-1)*F(n)

Il seguente codice di esempio mostra come utilizzare la ricorsione per trovare il fattoriale di un intero:

public static long factorial(long n) {
	if (n == 1)
		return 1;
	else
		return (n * factorial(n - 1));
}

13. Come si inverte una lista collegata in Java?

LinkedList descendingIterator() restituisce un iteratore che itera sugli elementi in ordine inverso. Il seguente codice di esempio mostra come utilizzare questo iteratore per creare una nuova lista collegata con gli elementi elencati nell’ordine inverso:

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);

Scopri di più sulla inversione di una lista collegata da una prospettiva di strutture dati e algoritmi.

14. Come si implementa una ricerca binaria in Java?

Gli elementi dell’array devono essere ordinati per implementare la ricerca binaria. L’algoritmo di ricerca binaria si basa sulle seguenti condizioni:

  • Se la chiave è minore dell’elemento centrale, allora devi cercare solo nella prima metà dell’array.
  • Se la chiave è maggiore dell’elemento centrale, allora devi cercare solo nella seconda metà dell’array.
  • Se la chiave è uguale all’elemento centrale nell’array, allora la ricerca termina.
  • Infine, se la chiave non viene trovata nell’intero array, dovrebbe restituire -1. Questo indica che l’elemento non è presente.

Il seguente codice di esempio implementa una ricerca binaria:

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. Scrivi un programma Java che illustra il merge sort.

Merge sort è uno degli algoritmi di ordinamento più efficienti. Funziona secondo il principio della “divide et impera”. Si basa sull’idea di suddividere una lista in diverse sottoliste fino a quando ciascuna sottolista è composta da un singolo elemento, e poi unire quelle sottoliste in modo che il risultato sia una lista ordinata. L’esempio di codice seguente mostra un modo per utilizzare il merge sort:

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. Puoi creare una piramide di caratteri in Java?

I programmi a modello sono un argomento molto popolare nei colloqui. Questo tipo di domanda viene utilizzato per comprendere le capacità di pensiero logico dell’intervistato. Consulta Programmi a Modello Piramidale in Java per esempi di diversi modi per creare modelli piramidali.

17. Scrivi un programma Java che controlla se due array contengono gli stessi elementi.

Per verificare se due array contengono gli stessi elementi, è necessario prima creare un insieme di elementi da entrambi gli array, e poi confrontare gli elementi in questi insiemi per vedere se c’è un elemento che non è presente in entrambi gli insiemi. Il seguente codice di esempio mostra come verificare se due array contengono solo elementi comuni:

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));
		
		// se le dimensioni sono diverse, significa che ci sarà una discrepanza
		if (uniqueElements1.size() != uniqueElements2.size()) return false;
		
		for (Object obj : uniqueElements1) {
			// elemento non presente in entrambi?
			if (!uniqueElements2.contains(obj)) return false;
		}
		
		return true;
	}

}
Output
true false

18. Come si ottiene la somma di tutti gli elementi in un array di interi in Java?

Puoi utilizzare un ciclo for per iterare sugli elementi dell’array e sommarli per ottenere la somma finale:

int[] array = { 1, 2, 3, 4, 5 };

int sum = 0;

for (int i : array)
	sum += i;

System.out.println(sum);

19. Come si trova il secondo numero più grande in un array in Java?

Esistono molti modi per risolvere questo problema. Puoi ordinare l’array in ordine ascendente naturale e prendere il secondo valore più grande. Tuttavia, l’ordinamento è un’operazione costosa. Puoi anche utilizzare due variabili per trovare il secondo valore più grande in un’unica iterazione, come mostrato nell’esempio seguente:

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. Come si mescola un array in Java?

Il codice di esempio seguente mostra come utilizzare la classe Random per generare numeri di indice casuali e mescolare gli elementi:

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));

Puoi eseguire il codice di mescolamento all’interno di un altro ciclo for per mescolare più volte.

21. Come puoi trovare una stringa in un file di testo in Java?

Il codice di esempio seguente mostra come utilizzare la classe Scanner per leggere i contenuti del file riga per riga e quindi utilizzare il metodo String contains() per verificare se la stringa è presente nel file:

boolean findStringInFile(String filePath, String str) throws FileNotFoundException {
	File file = new File(filePath);

	Scanner scanner = new Scanner(file);

	// leggi il file riga per riga
	while (scanner.hasNextLine()) {
		String line = scanner.nextLine();
		if (line.contains(str)) {
			scanner.close();
			return true;
		}
	}
	scanner.close();

	return false;
}

Nota che il codice di esempio assume che la stringa che stai cercando nel file non contenga caratteri di nuova riga.

22. Come stampare una data in un formato specifico in Java?

L’esempio di codice seguente mostra come utilizzare la classe SimpleDateFormat per formattare la stringa di data:

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

String date = simpleDateFormat.format(new Date());
System.out.println(date); // 06-23-2020

Scopri di più sul Java SimpleDateFormat.

23. Come si uniscono due liste in Java?

L’esempio di codice seguente mostra come utilizzare il metodo addAll() per unire più liste 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. Scrivi un programma Java che ordina HashMap in base al valore.

HashMap non è una collezione ordinata. L’esempio di codice seguente mostra come ordinare le voci in base al valore e memorizzarle in un LinkedHashMap, che mantiene l’ordine di inserimento:

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<>();

		// ottieni l'insieme di voci
		Set<Entry<String, Integer>> entrySet = scores.entrySet();
		System.out.println(entrySet);

		// crea una lista poiché l'insieme è non ordinato
		List<Entry<String, Integer>> entryList = new ArrayList<>(entrySet);
		System.out.println(entryList);

		// ordina la lista per valore
		entryList.sort((x, y) -> x.getValue().compareTo(y.getValue()));
		System.out.println(entryList);

		// popola la nuova mappa hash
		for (Entry<String, Integer> e : entryList)
			sortedByValue.put(e.getKey(), e.getValue());

		return sortedByValue;
	}

}

25. Come rimuovere tutte le occorrenze di un dato carattere da una stringa di input in Java?

La classe String non ha un metodo per rimuovere i caratteri. L’esempio di codice seguente mostra come utilizzare il metodo replace() per creare una nuova stringa senza il carattere specificato:

String str1 = "abcdABCDabcdABCD";
		
str1 = str1.replace("a", ""); 

System.out.println(str1); // bcdABCDbcdABCD

La stringa è immutabile in Java. Tutti i metodi di manipolazione delle stringhe restituiscono una nuova stringa, motivo per cui è necessario assegnarla a un’altra variabile. Per ulteriori informazioni su come rimuovere i caratteri da una stringa in Java.

26. Come ottenere caratteri distinti e il loro conteggio in una stringa in Java?

Puoi creare un array di caratteri dalla stringa. Quindi itera su di esso e crea una HashMap con il carattere come chiave e il suo conteggio come valore. Il seguente codice di esempio mostra come estrarre e contare i caratteri di una stringa:

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. Puoi dimostrare in modo programmato che un oggetto String in Java è immutabile?

Il seguente codice di esempio dimostra che un oggetto String è immutabile e i commenti nel codice spiegano ogni passo:

String s1 = "Java"; // String "Java" creato nel pool e riferimento assegnato a s1

String s2 = s1; // s2 ha anche lo stesso riferimento a "Java" nel pool

System.out.println(s1 == s2); // prova che s1 e s2 hanno lo stesso riferimento

s1 = "Python"; 
// il valore di s1 è stato modificato sopra, quindi come può essere immutabile la Stringa?

// nel caso sopra è stata creata una nuova Stringa "Python" nel pool
// s1 ora fa riferimento alla nuova Stringa nel pool 
// MA, la Stringa originale "Java" è ancora invariata e rimane nel pool
// s2 fa ancora riferimento alla Stringa originale "Java" nel pool

// prova che s1 e s2 hanno riferimenti diversi
System.out.println(s1 == s2); 

System.out.println(s2); 
// stampa "Java" confermando che il valore originale della Stringa è invariato, quindi la Stringa è immutabile

28. Puoi scrivere del codice per mostrare l’ereditarietà in Java?

Il codice di esempio seguente mostra come utilizzare la parola chiave extends per creare una sottoclasse della classe Animal. La nuova classe Cat eredita la variabile dalla classe Animal e aggiunge altro codice che appartiene solo alla classe Cat.

class Animal {
	String color;
}

class Cat extends Animal {
	void meow() {
		System.out.println("Meow");
	}
}

29. Come si può mostrare un problema a forma di diamante con l’ereditarietà multipla in Java?

Il problema a forma di diamante si verifica quando una classe eredita da più classi e si verifica un’ambiguità nel momento in cui non è chiaro quale metodo eseguire da quale classe. Java non consente l’estensione di più classi per evitare il problema a forma di diamante, come illustrato nell’esempio seguente:

interface I {
	void foo();
}
class A implements I {
	public void foo() {}
}

class B implements I {
	public void foo() {}
}

class C extends A, B { // non verrà compilato
	public void bar() {
		super.foo();
	}
}

30. Come si può illustrare un esempio di try-catch in Java?

L’esempio di codice seguente mostra un esempio di try-catch:

try {
	FileInputStream fis = new FileInputStream("test.txt");
} catch(FileNotFoundException e) {
	e.printStackTrace();
}

A partire da Java 7, è possibile catturare anche più eccezioni in un singolo blocco catch, come mostrato nell’esempio seguente. È utile quando si ha lo stesso codice in tutti i blocchi catch.

public static void foo(int x) throws IllegalArgumentException, NullPointerException {
	// qualche codice
}

public static void main(String[] args) {
	try {
		foo(10);
	} catch (IllegalArgumentException | NullPointerException e) {
		System.out.println(e.getMessage());
	}
}

31. Scrivi un programma Java per mostrare una NullPointerException.

Se stai chiamando una funzione su null, verrà generata una NullPointerException, come mostrato nel seguente codice di esempio:

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()); // Eccezione nel thread "main" java.lang.NullPointerException
	}
}

Dovresti avere una verifica di null in atto per una valida convalida anticipata, come mostrato nel seguente codice di esempio:

static void printString(String s, int count) {
	if (s == null) return;
	for (int i = 0; i < count; i++) {
		System.out.println(s.toUpperCase());
	}
}

Puoi anche generare un’eccezione IllegalArgumentException in base ai requisiti del progetto.

32. Come si crea un record in Java?

I record sono stati aggiunti come funzionalità standard in Java 16. I record ti consentono di creare una classe POJO con un codice minimo. I record generano automaticamente i metodi hashCode(), equals(), i metodi getter e il codice del metodo toString() per la classe. I record sono finali e estendono implicitamente la classe java.lang.Record. Il seguente codice di esempio mostra un modo per creare un record:

import java.util.Map;
 
public record EmpRecord(int id, String name, long salary, Map<String, String> addresses) {
}

Scopri di più su registri in Java. Per ulteriori dettagli su POJO, consulta Plain old Java object su Wikipedia.

33. Come si creano blocchi di testo in Java?

Java 15 ha aggiunto la funzionalità dei blocchi di testo. Puoi creare stringhe multiriga utilizzando i blocchi di testo. La stringa multiriga deve essere scritta all’interno di un paio di virgolette doppie triple, come mostrato nell’esempio seguente:

String textBlock = """
		Hi
		Hello
		Yes""";

È lo stesso di creare una stringa, come Hi\\nHello\\nYes.

34. Mostra un esempio di espressioni switch e istruzioni case multi-etichetta in Java.

Le espressioni switch sono state aggiunte come funzionalità standard in Java 14. Gli esempi seguenti mostrano sia le espressioni switch che le istruzioni case multi-etichetta:

int choice = 2;

int x = switch (choice) {
    case 1, 2, 3:
	    yield choice;
    default:
	    yield -1;
};

System.out.println("x = " + x); // x = 2

Puoi anche utilizzare le espressioni lambda nelle espressioni switch.

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. Come si compila e esegue una classe Java dalla riga di comando?

Questo esempio si riferisce al seguente file Java:

public class Test {

public static void main(String args[]) {
		System.out.println("Hi");
	}

}

Puoi compilarlo usando il seguente comando nel tuo terminale:

  1. javac Test.java

Per eseguire la classe, utilizza il seguente comando nel tuo terminale:

  1. java Test

Per le versioni recenti, il comando java compilerà anche il programma se il file della classe non è presente. Se la classe si trova in un package, come com.example, allora dovrebbe trovarsi nella cartella com/example. Il comando per compilare ed eseguire è:

  1. java com/example/Test.java

Se la tua classe richiede alcuni JAR aggiuntivi per compilare ed eseguire, puoi utilizzare l’opzione java -cp. Ad esempio:

  1. java -cp .:~/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar com/example/Test.java

36. Come si crea un enum in Java?

L’esempio di codice seguente mostra come creare un enum di base:

public enum ThreadStates {
	START,
	RUNNING,
	WAITING,
	DEAD;
}

ThreadStates è l’enum con campi costanti fissi START, RUNNING, WAITING e DEAD. Tutti gli enum estendono implicitamente la classe java.lang.Enum e implementano le interfacce Serializable e Comparable. Gli enum possono anche avere metodi. Scopri di più sugli enum in Java.

37. Come si utilizza il metodo forEach() in Java?

Il metodo forEach() fornisce un modo rapido per eseguire un’azione su tutti gli elementi di un iterabile. Il seguente esempio di codice mostra come iterare sugli elementi della lista e stamparli:

List<String> list = new ArrayList<>();

Iterator<String> it = list.iterator();

while (it.hasNext()) {
	System.out.println(it.next());
}

Puoi utilizzare il metodo forEach() con un’espressione lambda per ridurre le dimensioni del codice, come mostrato nel seguente esempio di codice:

List<String> list = new ArrayList<>();

list.forEach(System.out::print);

38. Come si scrive un’interfaccia con metodo default e static?

Java 8 ha introdotto metodi predefiniti e statici nelle interfacce. Questo ha colmato il divario tra le interfacce e le classi astratte. Il codice di esempio seguente mostra un modo per scrivere un’interfaccia con i metodi default e static:

public interface Interface1 {
	
	// metodo astratto regolare
	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;
	}

}

Per saperne di più su default e static methods nelle interfacce, consulta Java 8 interface changes.

39. Come si crea un’interfaccia funzionale?

Un’interfaccia con esattamente un metodo astratto è chiamata interfaccia funzionale. Il principale vantaggio delle interfacce funzionali è che è possibile utilizzare espressioni lambda per istanziarle e evitare l’uso di un’implementazione di classe anonima ingombrante. L’annotazione @FunctionalInterface indica un’interfaccia funzionale, come mostrato nel codice di esempio seguente:

@FunctionalInterface
interface Foo {
	void test();
}

40. Mostra un esempio di utilizzo di espressioni lambda in Java.

Runnable è un ottimo esempio di un’interfaccia funzionale. Puoi utilizzare le espressioni lambda per creare un oggetto eseguibile, come mostrato nel seguente codice di esempio:

Runnable r1 = () -> System.out.println("My Runnable");

41. Mostra esempi di sovraccarico e sovrascrittura in Java.

Quando una classe ha due o più metodi con lo stesso nome, vengono chiamati metodi sovraccaricati. Il seguente codice di esempio mostra un metodo sovraccaricato chiamato 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--;
		}
	}

}

Quando un metodo della classe genitore è implementato anche nella classe figlia, si chiama sovrascrittura. Il seguente codice di esempio mostra come annotare il metodo printname() implementato in entrambe le classi:

class Base {
	void printName() {
		System.out.println("Base Class");
	}
}

class Child extends Base {
	@Override
	void printName() {
		System.out.println("Child Class");
	}
}

Approfondisci su sovrascrittura e sovraccarico in Java.

42.-49. Indovina l’Output

Testati indovinando l’output dei seguenti frammenti di codice.


String s1 = "abc";
String s2 = "abc";

System.out.println("s1 == s2 is:" + s1 == s2);
Output
false

L’output della dichiarazione data è false perché l’operatore + ha una precedenza maggiore rispetto all’operatore ==. Quindi, l’espressione data è valutata come “s1 == s2 is:abc” == “abc”, che è false.


String s3 = "JournalDev";
int start = 1;
char end = 5;

System.out.println(s3.substring(start, end));
Output
ourn

L’output della dichiarazione data è ourn. Il primo carattere viene automaticamente convertito in int. Quindi, poiché l’indice del primo carattere è 0, partirà da o e stamperà fino a n. Si noti che il metodo String substring crea una sottostringa che inizia all’indice start e si estende fino al carattere all’indice 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

La dimensione del shortSet è 100. La funzionalità di autoboxing in Java significa che l’espressione i, che ha il tipo primitivo short, viene convertita in un oggetto Short. Allo stesso modo, l’espressione i - 1 ha il tipo primitivo int ed è autoboxata in un oggetto Integer. Poiché non c’è un oggetto Integer nell’HashSet, nulla viene rimosso e la dimensione è 100.


try {
	if (flag) {
  		while (true) {
   		}
   	} else {
   		System.exit(1);
   	}
} finally {
   	System.out.println("In Finally");
}
Output

Nessun output. Questo codice porta a un loop infinito se il flag è true e il programma termina se il flag è false. Il blocco finally non verrà mai raggiunto.


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

La dichiarazione di stampa data genererà una java.lang.NullPointerException perché l’operatore logico OR valuta entrambi i letterali prima di restituire il risultato. Poiché str è null, il metodo .equals() genererà un’eccezione. È sempre consigliabile utilizzare gli operatori logici a corto circuito, come || e &&, che valutano i valori letterali da sinistra a destra. In questo caso, poiché il primo letterale restituirebbe true, salterebbe la valutazione del secondo letterale.


String x = "abc";
String y = "abc";

x.concat(y);

System.out.print(x);
Output
abc

Il codice x.concat(y) crea una nuova stringa ma non viene assegnato a x, quindi il valore di x non cambia.


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)

Anche se potrebbe sembrare che questa domanda riguardi l’ordine di esecuzione degli operatori matematici, in realtà la domanda riguarda il fatto che il metodo principale non è stato dichiarato 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

Questo codice porta a un errore di compilazione. L’eccezione IOException è già gestita dall’alternativa Exception.

Trova 5 errori nel seguente frammento di codice.

package com.digitalocean.programming-interviews;

public class String Programs {

	static void main(String[10] args) {
		String s = "abc"
		System.out.println(s);
	}
}
Answers
  1. Il nome del pacchetto non può contenere trattini.
  2. Il nome della classe non può contenere spazi.
  3. Il metodo principale non è public, quindi non verrà eseguito.
  4. L’argomento del metodo principale non dovrebbe specificare la dimensione.
  5. Il punto e virgola manca nella definizione della stringa.

Conclusione

Questa raccolta di 50 domande di intervista sulla programmazione Java include domande dal livello principiante a quello esperto, per aiutarti a prepararti per il colloquio.

Lettura consigliata:

Source:
https://www.digitalocean.com/community/tutorials/java-programming-interview-questions