Introdução
Se você está sendo entrevistado para uma vaga de programação em Java, é provável que suas habilidades de codificação sejam testadas. Seja você um iniciante em Java ou um programador experiente, este artigo fornece algumas perguntas comuns de entrevista em Java e suas respostas para ajudar na preparação.
1. Como inverter uma string em Java?
Não há um método de utilidade reverse()
na classe String
. No entanto, você pode criar uma matriz de caracteres a partir da string e, em seguida, percorrê-la do final para o início. Você pode anexar os caracteres a um construtor de strings 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. Observe que a indexação em Java começa em 0, então você precisa começar em chars.length - 1
no loop for
.
2. Como trocar dois números sem usar uma terceira variável em Java?
A troca de 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 código de exemplo 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 demonstra que os valores inteiros são trocados:
Outputa 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 código de exemplo 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 dado 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;
}
}
Embora 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 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);
}
}
Output0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
Você também pode usar recursão para imprimir uma sequência de Fibonacci, porque o número de Fibonacci é gerado adicionando os dois números anteriores na sequência:
F(N) = F(N-1) + F(N-2)
A classe de exemplo a seguir mostra como usar recursão para calcular uma sequência de Fibonacci que tenha 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) + " ");
}
}
}
OutputA 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 loop for
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, como mostrado no exemplo de código a seguir:
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 qualquer elemento atender à condição
}
Para saber 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();
}
Aprenda mais sobre como remover 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 a 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 sobrecarregados de sort()
para ordenar arrays primitivos e de objetos. Se estiver ordenando um array primitivo na ordem natural, 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 desejar ordenar um array de objetos, o objeto deve implementar a interface Comparable
. Se 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 programaticamente um cenário de deadlock em Java?
A situação de deadlock é um cenário em um ambiente Java multithreaded onde dois ou mais threads estão bloqueados indefinidamente. A situação de deadlock surge com dois 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 esperando indefinidamente para adquirir a trava no segundo objeto. Você pode usar o Java thread dump 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 encadeada 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 encadeada com os 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);
Saiba mais sobre a reversão de uma lista encadeada a partir de uma perspectiva de estruturas de dados e algoritmos.
14. Como você implementa uma busca binária em Java?
Os elementos do array devem estar classificados 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, ela 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 mesclagem.
O merge sort é um dos algoritmos de ordenação mais eficientes. Ele trabalha com o princípio de “dividir para conquistar”. Baseia-se 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ão 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ão de Pirâmide em Java para exemplos de diferentes maneiras de criar padrões de pirâmide.
17. Escreva um programa em Java que verifica se dois arrays contêm os mesmos elementos.
Para verificar se dois arrays contêm os mesmos elementos, é necessário primeiro criar um conjunto de elementos a partir de ambos os arrays e, em seguida, comparar os elementos nesses conjuntos para verificar se há algum elemento ausente 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;
}
}
Outputtrue
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 ascendente natural e pegar o segundo 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 rodadas.
21. Como 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 imprimir 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 ordena um HashMap por valor.
A 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 um 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, já que o conjunto é não ordenado
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 você remove 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 fornecido:
String str1 = "abcdABCDabcdABCD";
str1 = str1.replace("a", "");
System.out.println(str1); // bcdABCDbcdABCD
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"; // A string "Java" é criada no pool e a referência é atribuída a s1
String s2 = s1; // s2 também possui 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 foi alterado, portanto, String é imutável
28. Você pode escrever algum código para mostrar herança em Java?
O código de exemplo a seguir 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 exclusivamente à classe Cat
.
class Animal {
String color;
}
class Cat extends Animal {
void meow() {
System.out.println("Meow");
}
}
29. Como você mostra um problema de diamante com herança múltipla em Java?
O problema de diamante ocorre quando uma classe herda de várias classes e surge ambiguidade sobre qual método executar de qual classe. Java não permite estender várias classes para evitar o problema de diamante, como ilustrado no exemplo a seguir:
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 compilará
public void bar() {
super.foo();
}
}
30. Como você ilustra um exemplo de try-catch em Java?
O código de exemplo a seguir 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 várias exceções em um único bloco catch, como mostrado no exemplo a seguir. Isso é ú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 você estiver chamando uma função em null
, ela lançará uma NullPointerException
, como mostrado no seguinte código de exemplo:
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()); // Exceção na thread "main" java.lang.NullPointerException
}
}
Você deve ter uma verificação de nulo no lugar para validação precoce, como mostrado no seguinte código de exemplo:
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 um recurso padrão no Java 16. Os 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 código do método toString()
para a classe. Os registros são finais e estendem implicitamente a classe java.lang.Record
. O seguinte código de exemplo 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 mais 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 triplas, 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 com várias opções 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 com várias opções:
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:
- javac Test.java
Para executar a classe, use o seguinte comando no seu terminal:
- java Test
Nas versões recentes, o comando java
também irá compilar o programa se o arquivo de classe não estiver presente. Se a classe estiver em um pacote, como com.example
, então ela deve estar dentro da pasta com/example
. O comando para compilar e executar é:
- java com/example/Test.java
Se sua classe requer alguns JARs adicionais para compilar e executar, você pode usar a opção java -cp
. Por exemplo:
- java -cp .:~/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar com/example/Test.java
36. Como você cria um enum em Java?
O seguinte código de exemplo mostra como criar um enum básico:
public enum ThreadStates {
START,
RUNNING,
WAITING,
DEAD;
}
ThreadStates
é a enumeração com campos de constantes fixas START
, RUNNING
, WAITING
e DEAD
. Todas as enumerações estendem implicitamente a classe java.lang.Enum
e implementam as interfaces Serializable
e Comparable
. As enumerações também podem ter métodos. Saiba mais sobre enumerações em Java.
37. Como usar o método forEach()
em Java?
O método forEach()
fornece um atalho para realizar 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
?
Java 8 introduziu métodos padrão e estáticos em interfaces. Isso preencheu 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 de interface 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ção de classe anônima volumosa. 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. Mostrar exemplos de sobrecarga e sobreposição em Java.
Quando uma classe possui dois ou mais métodos com o mesmo nome, eles são chamados de métodos sobrecarregados. O código de exemplo a seguir 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 código de exemplo a seguir mostra como anotar o método printname()
que é 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 instrução dada é false
porque o operador +
tem uma precedência maior do que o operador ==
. Assim, a expressão dada é avaliada como “s1 == s2 é:abc” == “abc”
, que é false
.
String s3 = "JournalDev";
int start = 1;
char end = 5;
System.out.println(s3.substring(start, end));
Output
ourn
O resultado da declaração fornecida é ourn
. O primeiro caractere é automaticamente convertido para int
. Em seguida, como o índice do primeiro caractere é 0, ele começará de o
e imprimirá até n
. Observe que o método String substring
cria uma substring 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 conjunto shortSet
é 100
. A funcionalidade 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 é autoboxada para um objeto Integer
. Como não há um 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 instrução de impressão fornecida lançará uma java.lang.NullPointerException
porque o operador lógico OR
avalia ambas as 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 a primeira literal retornaria true
, ela ignoraria a avaliação da segunda literal.
String x = "abc";
String y = "abc";
x.concat(y);
System.out.print(x);
Output
abc
O método 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 trata da ordem de execução dos operadores matemáticos, na verdade, a pergunta é sobre notar 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 tempo de compilação. A exceção IOException
já é capturada pela alternativa Exception
.
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
- O nome do pacote não pode conter hifens.
- O nome da classe não pode conter espaços.
- O método principal não é
public
, então não será executado. - O argumento do método principal não deve especificar o tamanho.
- 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 inclui questões desde o nível iniciante até o especialista, para ajudá-lo a se preparar para sua entrevista.
Leitura recomendada:
Source:
https://www.digitalocean.com/community/tutorials/java-programming-interview-questions