Principais 50 Perguntas de Entrevista de Programação Java

Introdução

Se estiver a ser entrevistado para um cargo de programação Java, então é provável que as suas habilidades de codificação sejam testadas. Quer seja um iniciante em Java ou um programador especialista, este artigo fornece algumas perguntas comuns de entrevista em Java e respostas para ajudá-lo a se preparar.

1. Como inverter uma string em Java?

Não existe um método utilitário reverse() na classe String. No entanto, você pode criar uma matriz de caracteres a partir da string e depois iterá-la do final para o início. Você pode anexar os caracteres a um construtor de string e, finalmente, retornar a string invertida.

O código de exemplo a seguir mostra uma maneira de inverter uma string:

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

}

Pontos extras por adicionar verificação de null no método e usar StringBuilder para anexar os caracteres. Note que a indexação em Java começa em 0, então você precisa começar em chars.length - 1 no laço for.

2. Como você troca dois números sem usar uma terceira variável em Java?

Trocar números sem usar uma terceira variável é um processo de três etapas que é melhor visualizado no código:

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)

O exemplo de código a seguir mostra uma maneira de implementar o método de troca de números:

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

}

A saída mostra que os valores inteiros são trocados:

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

3. Escreva um programa Java para verificar se uma vogal está presente em uma string.

O exemplo de código a seguir mostra como usar uma expressão regular para verificar se a string contém vogais:

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. Escreva um programa Java para verificar se o número fornecido é um número primo.

Você pode escrever um programa para dividir o número fornecido n por um número de 2 a n/2 e verificar o resto. Se o resto for 0, então não é um número primo. O código de exemplo a seguir mostra uma maneira de verificar se um número dado é um número primo:

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

}

Mesmo que este programa funcione, não é muito eficiente em termos de memória e tempo. Considere que, para um número dado N, se houver um número primo M entre 2 e √N (raiz quadrada de N) que divide uniformemente, então N não é um número primo.

5. Escreva um programa em Java para imprimir uma sequência de Fibonacci usando recursão.

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,

Você também pode usar a recursão para imprimir uma sequência de Fibonacci, porque o número de Fibonacci é gerado pela adição dos dois números anteriores na sequência:

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

A classe de exemplo a seguir mostra como usar a recursão para calcular uma sequência de Fibonacci com 10 números:

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. Como verificar se uma lista de inteiros contém apenas números ímpares em Java?

Você pode usar um for loop e verificar se cada elemento é ímpar:

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

	return true;
}

Se a lista for grande, você pode usar um fluxo paralelo para processamento mais rápido, conforme mostrado no seguinte código de exemplo:

public static boolean onlyOddNumbers(List<Integer> list) {
	return list
			.parallelStream() // fluxo paralelo para processamento mais rápido
			.anyMatch(x -> x % 2 != 0); // retorna assim que quaisquer elementos satisfizerem a condição
}

Para aprender mais sobre a matemática por trás da determinação se um inteiro é ímpar, consulte a Operação de Módulo na Wikipedia.

7. Como verificar se uma string é um palíndromo em 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. Como remover espaços de uma string em Java?

O seguinte exemplo de código mostra uma maneira de remover espaços de uma string usando o método 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();
}

Saiba mais sobre a remoção de espaços e outros caracteres de uma string em Java.

9. Como remover espaços em branco no início e no final de uma string em Java?

A classe String contém dois métodos para remover espaços em branco no início e no final: trim() e strip(). O método strip() foi adicionado à classe String no Java 11. O método strip() utiliza o método Character.isWhitespace() para verificar se o caractere é um espaço em branco. Este método utiliza pontos de código Unicode, enquanto o método trim() identifica qualquer caractere com um valor de ponto de código menor ou igual a U+0020 como um caractere de espaço em branco.

O método strip() é a maneira recomendada de remover espaços em branco, pois utiliza o padrão Unicode. O seguinte exemplo de código mostra como usar o método strip() para remover espaços em branco:

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

Como String é imutável, você precisa atribuir a saída de strip() à string.

10. Como ordenar um array em Java?

A classe de utilitário Arrays possui muitos métodos sort() sobrecarregados para ordenar arrays primitivos e de objetos. Se você estiver ordenando um array primitivo na ordem natural, então pode usar o método Arrays.sort(), conforme mostrado no exemplo a seguir:

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

Arrays.sort(array);

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

No entanto, se você deseja ordenar um array de objetos, então o objeto deve implementar a interface Comparable. Se você quiser especificar os critérios de ordenação, pode passar o Comparator para a lógica de ordenação. Saiba mais sobre Comparable e Comparator em Java.

11. Como criar um cenário de deadlock programaticamente em Java?

O deadlock é um cenário em um ambiente Java com várias threads onde duas ou mais threads estão bloqueadas para sempre. A situação de deadlock surge com duas ou mais threads. O código de exemplo a seguir cria um cenário de 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();
        }
    }

}

Todas as três threads serão capazes de adquirir uma trava no primeiro objeto. No entanto, elas estão usando recursos compartilhados e são iniciadas de tal forma que continuarão aguardando indefinidamente para adquirir a trava no segundo objeto. Você pode usar o despejo de thread Java para detectar os deadlocks. Saiba mais sobre deadlock em Java.

12. Como você pode encontrar o fatorial de um número inteiro em Java?

O fatorial de um número inteiro é calculado multiplicando todos os números de 1 até o número dado:

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

O código de exemplo a seguir mostra como usar a recursão para encontrar o fatorial de um número inteiro:

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

13. Como você inverte uma lista vinculada em Java?

LinkedList descendingIterator() retorna um iterador que percorre os elementos na ordem inversa. O código de exemplo a seguir mostra como usar esse iterador para criar uma nova lista vinculada com elementos listados na ordem inversa:

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

Aprenda mais sobre inverter uma lista encadeada do ponto de vista de estruturas de dados e algoritmos.

14. Como implementar uma busca binária em Java?

Os elementos do array devem estar ordenados para implementar a busca binária. O algoritmo de busca binária é baseado nas seguintes condições:

  • Se a chave for menor que o elemento do meio, então você precisa procurar apenas na primeira metade do array.
  • Se a chave for maior que o elemento do meio, então você precisa procurar apenas na segunda metade do array.
  • Se a chave for igual ao elemento do meio no array, então a busca termina.
  • Finalmente, se a chave não for encontrada em todo o array, deve retornar -1. Isso indica que o elemento não está presente.

O código de exemplo a seguir implementa uma busca binária:

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. Escreva um programa Java que ilustre a ordenação por fusão.

Merge sort é um dos algoritmos de ordenação mais eficientes. Funciona com base no princípio de “dividir e conquistar”. É baseado na ideia de dividir uma lista em várias sub-listas até que cada sub-lista consista em um único elemento, e então mesclar essas sub-listas de maneira que resulte em uma lista ordenada. O código de exemplo a seguir mostra uma maneira de usar o 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. Você pode criar uma pirâmide de caracteres em Java?

Os programas de padrões são um tópico de entrevista muito popular. Esse tipo de pergunta é usado para entender as habilidades de pensamento lógico do entrevistado. Consulte Programas de Padrões de Pirâmide em Java para exemplos de diferentes maneiras de criar padrões de pirâmide.

17. Escreva um programa Java que verifica se duas arrays contêm os mesmos elementos.

Para verificar se dois arrays contêm os mesmos elementos, você precisa primeiro criar um conjunto de elementos a partir de ambos os arrays e, em seguida, comparar os elementos nesses conjuntos para ver se há um elemento que não está presente em ambos os conjuntos. O código de exemplo a seguir mostra como verificar se dois arrays contêm apenas elementos comuns:

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 os tamanhos forem diferentes, significa que haverá uma incompatibilidade
		if (uniqueElements1.size() != uniqueElements2.size()) return false;
		
		for (Object obj : uniqueElements1) {
			// elemento não presente em ambos?
			if (!uniqueElements2.contains(obj)) return false;
		}
		
		return true;
	}

}
Output
true false

18. Como você obtém a soma de todos os elementos em um array de inteiros em Java?

Você pode usar um loop for para iterar sobre os elementos do array e somá-los para obter a soma final:

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

int sum = 0;

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

System.out.println(sum);

19. Como você encontra o segundo maior número em um array em Java?

Há muitas maneiras de resolver esse problema. Você pode ordenar o array em ordem natural crescente e pegar o segundo último valor. No entanto, a ordenação é uma operação cara. Você também pode usar duas variáveis para encontrar o segundo maior valor em uma única iteração, como mostrado no exemplo a seguir:

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. Como embaralhar um array em Java?

O código de exemplo a seguir mostra como usar a classe Random para gerar números de índice aleatórios e embaralhar os elementos:

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

Você pode executar o código de embaralhamento dentro de outro loop for para embaralhar várias vezes.

21. Como você pode encontrar uma string em um arquivo de texto em Java?

O código de exemplo a seguir mostra como usar a classe Scanner para ler o conteúdo do arquivo linha por linha e então usar o método String contains() para verificar se a string está presente no arquivo:

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

	Scanner scanner = new Scanner(file);

	// ler o arquivo linha por linha
	while (scanner.hasNextLine()) {
		String line = scanner.nextLine();
		if (line.contains(str)) {
			scanner.close();
			return true;
		}
	}
	scanner.close();

	return false;
}

Observe que o código de exemplo assume que a string que você está procurando no arquivo não contém caracteres de nova linha.

22. Como você imprime uma data em um formato específico em Java?

O código de exemplo a seguir mostra como usar a classe SimpleDateFormat para formatar a string de data:

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

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

Saiba mais sobre o Java SimpleDateFormat.

23. Como mesclar duas listas em Java?

O código de exemplo a seguir mostra como usar o método addAll() para mesclar várias listas em 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. Escreva um programa Java que ordene HashMap por valor.

HashMap não é uma coleção ordenada. O código de exemplo a seguir mostra como ordenar as entradas com base no valor e armazená-las em LinkedHashMap, que mantém a ordem de inserção:

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

		// obter o conjunto de entradas
		Set<Entry<String, Integer>> entrySet = scores.entrySet();
		System.out.println(entrySet);

		// criar uma lista, uma vez que o conjunto é desordenado
		List<Entry<String, Integer>> entryList = new ArrayList<>(entrySet);
		System.out.println(entryList);

		// ordenar a lista por valor
		entryList.sort((x, y) -> x.getValue().compareTo(y.getValue()));
		System.out.println(entryList);

		// popular o novo mapa de hash
		for (Entry<String, Integer> e : entryList)
			sortedByValue.put(e.getKey(), e.getValue());

		return sortedByValue;
	}

}

25. Como remover todas as ocorrências de um caractere específico de uma string de entrada em Java?

A classe String não possui um método para remover caracteres. O código de exemplo a seguir mostra como usar o método replace() para criar uma nova string sem o caractere específico:

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

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

A string é imutável em Java. Todos os métodos de manipulação de strings retornam uma nova string, por isso é necessário atribuí-la a outra variável. Saiba mais sobre remover caracteres de uma string em Java.

26. Como você obtém caracteres distintos e sua contagem em uma string em Java?

Você pode criar um array de caracteres a partir da string. Em seguida, itere sobre ele e crie um HashMap com o caractere como chave e sua contagem como valor. O código de exemplo a seguir mostra como extrair e contar os caracteres de uma string:

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. Você pode provar que um objeto String em Java é imutável programaticamente?

O código de exemplo a seguir mostra como provar que um objeto String é imutável e os comentários no código explicam cada etapa:

String s1 = "Java"; // "Java" String criado no pool e referência atribuída a s1

String s2 = s1; // s2 também tem a mesma referência para "Java" no pool

System.out.println(s1 == s2); // prova de que s1 e s2 têm a mesma referência

s1 = "Python"; 
// o valor de s1 foi alterado acima, então como String é imutável?

// no caso acima, uma nova String "Python" foi criada no pool
// s1 agora está se referindo à nova String no pool
// MAS, a String original "Java" ainda está inalterada e permanece no pool
// s2 ainda está se referindo à String original "Java" no pool

// prova de que s1 e s2 têm referências diferentes
System.out.println(s1 == s2); 

System.out.println(s2); 
// imprime "Java" apoiando o fato de que o valor original da String não é alterado, portanto, a String é imutável

28. Você pode escrever algum código para mostrar herança em Java?

O seguinte código de exemplo mostra como usar a palavra-chave extends para criar uma subclasse da classe Animal. A nova classe Cat herda a variável da classe Animal e adiciona mais código que pertence apenas à classe Cat.

class Animal {
	String color;
}

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

29. Como mostrar um problema de diamante com herança múltipla em Java?

O problema do diamante ocorre quando uma classe herda de várias classes e ocorre ambiguidade quando não está claro qual método executar de qual classe. Java não permite estender múltiplas classes para evitar o problema do diamante, ilustrado pelo seguinte exemplo:

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

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

class C extends A, B { // não irá compilar
	public void bar() {
		super.foo();
	}
}

30. Como ilustrar um exemplo de try catch em Java?

O seguinte código de exemplo mostra um exemplo de try-catch:

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

A partir do Java 7, você também pode capturar múltiplas exceções em um único bloco catch, como mostrado no seguinte exemplo. É útil quando você tem o mesmo código em todos os blocos catch.

public static void foo(int x) throws IllegalArgumentException, NullPointerException {
	// algum código
}

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

31. Escreva um programa Java para mostrar uma NullPointerException.

Se estiver chamando uma função em null, ela lançará uma NullPointerException, como mostrado no código de exemplo a seguir:

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

É importante ter uma verificação de nulidade no lugar para validação precoce, como mostrado no exemplo de código a seguir:

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

Você também pode lançar IllegalArgumentException com base nos requisitos do projeto.

32. Como você cria um registro em Java?

Os registros foram adicionados como uma funcionalidade padrão no Java 16. Registros permitem que você crie uma classe POJO com código mínimo. Os registros geram automaticamente os métodos hashCode(), equals(), métodos getter e o método toString() para a classe. Os registros são finais e implicitamente estendem a classe java.lang.Record. O código de exemplo a seguir mostra uma maneira de criar um registro:

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

Saiba mais sobre registros em Java. Para obter detalhes sobre POJO, consulte Plain old Java object na Wikipedia.

33. Como criar blocos de texto em Java?

O Java 15 adicionou o recurso de blocos de texto. Você pode criar strings de várias linhas usando blocos de texto. A string de várias linhas deve ser escrita dentro de um par de aspas triplo-duplas, como mostrado no exemplo a seguir:

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

É o mesmo que criar uma string, como Hi\\nHello\\nYes.

34. Mostre um exemplo de expressões de switch e declarações de caso multi-rótulos em Java.

As expressões de switch foram adicionadas como um recurso padrão no Java 14. Os exemplos a seguir mostram expressões de switch, bem como declarações de caso multi-rótulos:

int choice = 2;

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

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

Você também pode usar expressões lambda em expressões de 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. Como compilar e executar uma classe Java a partir da linha de comando?

Este exemplo refere-se ao seguinte arquivo Java:

public class Test {

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

}

Você pode compilá-lo usando o seguinte comando no seu terminal:

  1. javac Test.java

Para executar a classe, use o seguinte comando no seu terminal:

  1. java Test

Para as versões recentes, o comando java também irá compilar o programa se o arquivo da classe não estiver presente. Se a classe estiver em um pacote, como com.exemplo, então ela deve estar dentro da pasta com/exemplo. O comando para compilar e executar é:

  1. java com/example/Test.java

Se sua classe exigir alguns JARs adicionais para compilar e executar, você pode usar a opção java -cp. Por exemplo:

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

36. Como criar uma enumeração em Java?

O código de exemplo a seguir mostra como criar uma enumeração básica:

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

ThreadStates é a enumeração com campos de constantes fixas START, RUNNING, WAITING e DEAD. Todas as enums estendem implicitamente a classe java.lang.Enum e implementam as interfaces Serializable e Comparable. Enums também podem ter métodos. Saiba mais sobre enums em Java.

37. Como usar o método forEach() em Java?

O método forEach() fornece uma maneira rápida de executar uma ação em todos os elementos de um iterável. O código de exemplo a seguir mostra como iterar sobre os elementos da lista e imprimi-los:

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

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

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

Você pode usar o método forEach() com uma expressão lambda para reduzir o tamanho do código, como mostrado no exemplo a seguir:

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

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

38. Como escrever uma interface com método default e static?

O Java 8 introduziu métodos padrão e estáticos em interfaces. Isso reduziu a lacuna entre interfaces e classes abstratas. O código de exemplo a seguir mostra uma maneira de escrever uma interface com o método default e static:

public interface Interface1 {
	
	// método abstrato regular
	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;
	}

}

Saiba mais sobre os métodos default e static em interfaces em Alterações nas interfaces do Java 8.

39. Como você cria uma interface funcional?

Uma interface com exatamente um método abstrato é chamada de interface funcional. O principal benefício das interfaces funcionais é que você pode usar expressões lambda para instanciá-las e evitar o uso de implementações de classe anônimas volumosas. A anotação @FunctionalInterface indica uma interface funcional, como mostrado no código de exemplo a seguir:

@FunctionalInterface
interface Foo {
	void test();
}

40. Mostre um exemplo de uso de expressões lambda em Java.

Runnable é um excelente exemplo de uma interface funcional. Você pode usar expressões lambda para criar um runnable, como mostrado no seguinte código de exemplo:

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

41. Mostre exemplos de sobrecarga e sobreposição em Java.

Quando uma classe tem dois ou mais métodos com o mesmo nome, eles são chamados de métodos sobrecarregados. O seguinte código de exemplo mostra um método sobrecarregado chamado 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 um método da superclasse também é implementado na classe filha, é chamado de sobreposição. O seguinte código de exemplo mostra como anotar o método printname() que está implementado em ambas as classes:

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

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

Saiba mais sobre sobreposição e sobrecarga em Java.

42.-49. Adivinhe a Saída

Teste-se adivinhando a saída dos seguintes trechos de código.


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

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

A saída da declaração fornecida é false porque o operador + tem uma precedência maior do que o operador ==. Assim, a expressão fornecida é avaliada como “s1 == s2 is:abc” == “abc”, que é false.


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

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

A saída da declaração fornecida é ourn. O primeiro caractere é automaticamente convertido para int. Então, como o índice do primeiro caractere é 0, ele começará de o e imprimirá até n. Note que o método substring da classe String cria uma subcadeia que começa no índice start e se estende até o caractere no índice 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

O tamanho do shortSet é 100. O recurso de autoboxing em Java significa que a expressão i, que tem o tipo primitivo short, é convertida para um objeto Short. Da mesma forma, a expressão i - 1 tem o tipo primitivo int e é autoboxed para um objeto Integer. Como não há objeto Integer no HashSet, nada é removido e o tamanho é 100.


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

Sem saída. Este código resulta em um loop infinito se a flag for true e o programa sai se a flag for false. O bloco finally nunca será alcançado.


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

A declaração de impressão fornecida lançará um java.lang.NullPointerException porque o operador lógico OR avalia ambos os literais antes de retornar o resultado. Como str é null, o método .equals() lançará uma exceção. É sempre aconselhável usar operadores lógicos de curto-circuito, como || e &&, que avaliam os valores literais da esquerda para a direita. Neste caso, como o primeiro literal retornaria true, ele ignoraria a avaliação do segundo literal.


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

x.concat(y);

System.out.print(x);
Output
abc

O x.concat(y) cria uma nova string, mas não é atribuído a x, então o valor de x não é alterado.


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)

Embora possa parecer que esta pergunta é sobre a ordem de execução dos operadores matemáticos, na verdade, a pergunta é sobre perceber que o método principal não foi declarado como 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

Este código resulta em um erro de compilação. A exceção IOException já é capturada pelo Exception alternativo.

50. Encontre 5 erros no trecho de código a seguir.

package com.digitalocean.programming-interviews;

public class String Programs {

	static void main(String[10] args) {
		String s = "abc"
		System.out.println(s);
	}
}
Answers
  1. O nome do pacote não pode ter hifens.
  2. O nome da classe não pode ter espaços.
  3. O método principal não é public, então não será executado.
  4. O argumento do método principal não deve especificar o tamanho.
  5. O ponto e vírgula está faltando na definição da string.

Conclusão

Esta coleção de 50 perguntas de entrevista de programação Java incluiu perguntas do nível iniciante ao especialista, para ajudá-lo a se preparar para sua entrevista.

Leitura Recomendada:

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