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.
Por que a classe String
é uma chave popular em HashMap
em 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:
Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers