Perguntas e Respostas de Entrevista sobre Java String

Introdução

String é uma das classes Java mais amplamente utilizadas. Este artigo fornece algumas perguntas e respostas práticas sobre String para ajudar você a se preparar para uma entrevista.

Você também pode experimentar o Java String Quiz para testar seus conhecimentos sobre a classe String.

O que é a classe String em Java? String é um tipo de dado?

String é uma classe em Java e é definida no pacote java.lang. Não é um tipo de dado primitivo como int e long. A classe String representa cadeias de caracteres. String é usada em quase todas as aplicações Java. String é imutável e final em Java, e a JVM usa um pool de strings para armazenar todos os objetos String. Você pode instanciar um objeto String usando aspas duplas e pode sobrecarregar o operador + para concatenação.

Quais são algumas maneiras diferentes de criar um objeto String em Java?

Você pode criar um objeto String usando o operador new ou pode usar as aspas duplas para criar um objeto String. Por exemplo:

String str = new String("abc");
String str1 = "abc";

Há vários construtores disponíveis na classe String para obter uma String a partir de um array de caracteres, array de bytes, StringBuffer e StringBuilder.

Ao criar uma String usando aspas duplas, o JVM procura no pool de Strings para verificar se alguma outra String está armazenada com o mesmo valor. Se a String já estiver no pool, o JVM retorna a referência a esse objeto String. Se a nova String não estiver no pool, o JVM cria um novo objeto String com o valor fornecido e o armazena no pool de Strings. Quando você usa o operador new, o JVM cria o objeto String, mas não o armazena no pool de Strings. Você pode usar o método intern() para armazenar o objeto String no pool de Strings ou retornar a referência se já houver uma String com valor igual presente no pool.

Escreva um método em Java para verificar se uma string de entrada é um palíndromo.

A string is a palindrome if its value is the same when reversed. For example, aba is a palindrome string. The String class doesn’t provide any method to reverse the string but the StringBuffer and StringBuilder classes have a reverse() method that you can use to check whether a string is a palindrome. For example:

private static boolean isPalindrome(String str) {
    if (str == null)
        return false;
    StringBuilder strBuilder = new StringBuilder(str);
    strBuilder.reverse();
    return strBuilder.toString().equals(str);
}

Às vezes, um entrevistador pode solicitar que você não use nenhuma outra classe para verificar se é um palíndromo. Nesse caso, você pode comparar os caracteres na string de ambos os lados para descobrir se é um palíndromo. Por exemplo:

private static boolean isPalindromeString(String str) {
    if (str == null)
        return false;
    int length = str.length();
    System.out.println(length / 2);
    for (int i = 0; i < length / 2; i++) {
         if (str.charAt(i) != str.charAt(length - i - 1))
            return false;
    }
    return true;
}

Escreva um método em Java que removerá um caractere específico de um objeto string.

Podemos usar o método replaceAll para substituir todas as ocorrências de uma string por outra string. O ponto importante a observar é que replaceAll() aceita String como argumento, então você pode usar a classe Character para criar uma string e usá-la para substituir todos os caracteres por uma string vazia.

private static String removeChar(String str, char c) {
    if (str == null)
        return null;
    return str.replaceAll(Character.toString(c), "");
}

Como você pode transformar uma String em maiúsculas ou minúsculas em Java?

Você pode usar a classe String com os métodos toUpperCase e toLowerCase para obter o objeto String em letras maiúsculas ou minúsculas. Esses métodos possuem uma variante que aceita um argumento Locale e utiliza as regras do local fornecido para converter a string para maiúsculas ou minúsculas.

O que é o método String subSequence?

O Java 1.4 introduziu a interface CharSequence e a classe String implementa essa interface, por isso a classe String possui o método subSequence. Internamente, o método subSequence invoca o método String substring.

Como você compara duas strings em um programa Java?

Java `String` implementa a interface `Comparable`, que possui duas variantes do método `compareTo()`. O método `compareTo(String anotherString)` compara o objeto `String` com o argumento `String` passado lexicograficamente. Se o objeto `String` preceder o argumento passado, ele retorna um número inteiro negativo, e se o objeto `String` seguir o argumento passado, ele retorna um número inteiro positivo. Retorna zero quando ambos os objetos `String` têm o mesmo valor. Nesse caso, o método `equals(String str)` também retorna `true`. O método `compareToIgnoreCase(String str)` é semelhante ao primeiro, exceto que ele ignora maiúsculas e minúsculas. Ele utiliza `Comparator` com `CASE_INSENSITIVE_ORDER` para comparação insensível a maiúsculas e minúsculas. Se o valor for zero, então `equalsIgnoreCase(String str)` também retornará true.

Como você converte um `String` para uma matriz de caracteres em Java?

A String object is a sequence of characters, so you can’t convert it to a single character. You can use use the charAt method to get the character at given index or you can use the toCharArray() method to convert a string to character array. Learn more about converting a string to a character array.

Como você converte um `String` para uma matriz de bytes em Java?

Você pode usar o método getBytes() para converter um objeto String em uma matriz de bytes, e pode usar o construtor new String(byte[] arr) para converter uma matriz de bytes em um objeto String. Saiba mais sobre como converter uma string para uma matriz de bytes.

É possível usar String em uma estrutura switch case em Java?

O Java 7 estendeu a capacidade da estrutura switch case para lidar com Strings; versões anteriores do Java não oferecem suporte a isso. Se você estiver implementando fluxos condicionais para strings, pode usar condições if-else e pode usar switch case se estiver usando o Java 7 ou versões superiores. Saiba mais sobre switch case com strings em Java.

Escreva um programa Java para imprimir todas as permutações de uma string.

Você precisará usar recursão para encontrar todas as permutações de uma string. Por exemplo, as permutações de AAB são AAB, ABA e BAA. Você também precisa usar Set para garantir que não haja valores duplicados. Saiba mais sobre como encontrar todas as permutações de uma string.

Escreva uma função em Java para encontrar o palíndromo mais longo em uma determinada string.

A string can contain palindrome substrings within it. Learn more about how to find the longest palindrome substring in a string.

Quais são as diferenças entre String, StringBuffer e StringBuilder em Java?

A String object is immutable and final in Java, so whenever you manipulate a String object, it creates a new String object. String manipulations are resource consuming, so Java provides two utility classes for string manipulations, StringBuffer and StringBuilder.

StringBuffer e StringBuilder são classes mutáveis. As operações de StringBuffer são seguras para threads e sincronizadas, enquanto as operações de StringBuilder não são seguras para threads. Você deve usar StringBuffer em um ambiente de várias threads e usar StringBuilder em um ambiente de uma única thread. O desempenho de StringBuilder é mais rápido do que o de StringBuffer devido à falta de sobrecarga de sincronização.

Saiba mais sobre as diferenças entre String, StringBuffer e StringBuilder e benchmarking de StringBuffer e StringBuilder.

Por que String é imutável em Java?

String é imutável em Java porque isso oferece vários benefícios:

  • O pool de strings é possível porque String é imutável em Java.
  • Aumenta a segurança porque nenhum hacker pode alterar seu valor e é usado para armazenar informações sensíveis, como nome de usuário ou senha do banco de dados.
  • Como String é imutável, é seguro usar em multi-threading e você não precisa de sincronização.
  • Strings são utilizadas em carregadores de classes Java e a imutabilidade proporciona a garantia de que a classe correta está sendo carregada pela classe ClassLoader.

Saiba mais sobre por que String é imutável em Java.

Como dividir uma string em Java?

Você pode usar split(String regex) para dividir a String em um array de String com base na expressão regular fornecida.

Por que um array de caracteres é preferido em relação à String para armazenar senhas em Java?

A String object is immutable in Java and is stored in the string pool. Once it’s created it stays in the pool until garbage collection completes, so even though you’re done with the password it’s available in memory for longer duration. It’s a security risk because anyone having access to memory dump can find the password as clear text. If you use a character array to store password, you can set it to blank once you’re done with it. You can control for how long it’s available in memory and that avoids the security threat.

Como verificar se duas Strings são iguais em Java?

Existem duas maneiras de verificar se duas Strings são iguais. Você pode usar o operador == ou o método equals(). Quando você usa o operador ==, ele verifica o valor da String bem como a referência do objeto. Frequentemente na programação Java, você deseja verificar apenas a igualdade do valor da String. Nesse caso, você deve usar o método equals() para verificar se duas Strings são iguais. Existe outra função chamada equalsIgnoreCase que você pode usar para ignorar maiúsculas e minúsculas.

String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");

System.out.println("s1 == s2 ? " + (s1 == s2)); //true
System.out.println("s1 == s3 ? " + (s1 == s3)); //false
System.out.println("s1 equals s3 ? " + (s1.equals(s3))); //true

O que é o pool de strings em Java?

O pool de strings é um conjunto de objetos String armazenados na memória heap do Java. String é uma classe especial em Java e você pode criar um objeto String usando o operador new e também fornecendo valores entre aspas duplas. Saiba mais sobre o pool de strings Java.

O que faz o método String intern() em Java?

Quando o método intern() é invocado, se o pool já contiver uma String igual a este objeto String, conforme determinado pelo método equals(Object), então a string do pool é retornada. Caso contrário, este objeto String é adicionado ao pool e uma referência a este objeto String é retornada. Este método sempre retorna um objeto String que tem o mesmo conteúdo que este String, mas é garantido ser de um pool de strings exclusivas.

A classe String é thread-safe em Java?

A String object is immutable, so you can’t change its value after creation. This makes the String object thread-safe and so it can be safely used in a multi-threaded environment. Learn more about thread Safety in Java.

Uma vez que um objeto String é imutável, seu hashcode é armazenado em cache no momento da criação e não precisa ser calculado novamente. Isso o torna uma ótima opção para a chave em um Map, já que seu processamento é mais rápido do que outros objetos de chave de HashMap.

Advinhe a Saída

Teste-se tentando adivinhar a saída dos seguintes trechos de código Java.

public class StringTest {
    
  	public static void main(String[] args) {
   		String s1 = new String("digitalocean");
   		String s2 = new String("DIGITALOCEAN");
   		System.out.println(s1 = s2);
   	}
    
}
Output
DIGITALOCEAN

A saída é DIGITALOCEAN porque o código atribui o valor de String s2 a String s1. = é um operador de atribuição que atribui o valor de y a x no formato (x = y). == é um operador de comparação que verifica se o objeto de referência é o mesmo para as duas strings.


public class Test {
    
   	 public void foo(String s) {
   	 System.out.println("String");
   	 }
    
   	 public void foo(StringBuffer sb) {
   	 System.out.println("StringBuffer");
   	 }
    
   	 public static void main(String[] args) {
   		new Test().foo(null);
   	}
    
}
Output
Test.java:12: error: reference to foo is ambiguous
   		new Test().foo(null);
   		           ^
  both method foo(String) in Test and method foo(StringBuffer) in Test match

Este código resulta em um erro de compilação porque ambos os métodos foo têm o mesmo nome, e a chamada para o método foo em main está passando null. O compilador não sabe qual método chamar. Você também pode se referir ao erro de método X é ambíguo para o tipo Y.


String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
Output
false

A saída é false porque o código usa o operador new para criar o objeto String, então ele é criado na memória heap e s1 e s2 terão uma referência diferente. Se você criar as strings usando apenas aspas duplas, então elas estarão no pool de strings e imprimirá true.


String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
Output
false

A saída é false porque s2 não é do tipo String. A implementação do método equals() na classe String possui um operador instanceof para verificar se o tipo do objeto passado é String e retornar false se o objeto não for String.


String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
Output
false

A saída é false. O método intern() retorna a referência do objeto String do pool de strings. No entanto, o código não o atribui de volta para s2 e não há alteração em s2, então s1 e s2 têm uma referência de objeto diferente. Se você alterar o código na linha 3 para s2 = s2.intern();, então a saída será true.

Quantos objetos String são criados pelo seguinte código?

String s1 = new String("Hello");  
String s2 = new String("Hello");
Answer

A resposta é três. O código na linha 1 cria um objeto String com o valor Hello no pool de strings (primeiro objeto) e então cria um novo objeto String com o valor Hello na memória heap (segundo objeto). O código na linha 2 cria um novo objeto String com o valor Hello na memória heap (terceiro objeto) e reutiliza a string Hello do pool de strings.

Conclusão

Neste artigo, você revisou algumas questões de entrevista em Java especificamente sobre String.

Leitura recomendada:

Questões de Programação em Java
Programas de String em Java

Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers