Introdução
String
é uma das classes Java mais amplamente utilizadas. Este artigo fornece algumas perguntas e respostas de prática sobre String
para ajudá-lo a se preparar para uma entrevista.
Você também pode experimentar o Quiz de String Java para testar seu conhecimento da classe String
.
O que é a classe String
em Java? String
é um tipo de dados?
String
é uma classe em Java e é definida no pacote java.lang
. Não é um tipo de dados 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 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 array de char
, array de byte
, StringBuffer
e StringBuilder
.
Ao criar uma String
usando aspas duplas, a JVM verifica no pool de Strings se alguma outra String
está armazenada com o mesmo valor. Se a String
já estiver armazenada no pool, a JVM retorna a referência a esse objeto String
. Se a nova String
não estiver no pool, a JVM cria um novo objeto String
com o valor dado e o armazena no pool de Strings. Quando você usa o operador new
, a 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 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 um palíndromo. Nesse caso, você pode comparar os caracteres na string a partir de ambas as extremidades 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 Java que removerá um caractere dado de um objeto de 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 tornar uma String
maiúscula ou minúscula em Java?
Você pode usar a classe String
e os métodos toUpperCase
e toLowerCase
para obter o objeto String
em maiúsculas ou minúsculas. Esses métodos têm uma variante que aceita um argumento de Locale
e usam 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, razão pela qual 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
` precede o argumento passado, ele retorna um número inteiro negativo, e se o objeto `String
` segue o argumento passado, ele retorna um número inteiro positivo. Retorna zero quando ambos os objetos `String
` têm o mesmo valor. Neste caso, o método `equals(String str)
` também retorna `true
`. O método `compareToIgnoreCase(String str)
` é semelhante ao primeiro, exceto que ignora a caixa. 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 converter um `String
` para um array 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 converter um `String
` para um array de bytes em Java?
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 converter uma string para uma matriz de bytes.
É possível usar String
em um bloco switch case em Java?
O Java 7 estendeu a capacidade do bloco switch case para Strings
; versões anteriores do Java não oferecem suporte a isso. Se estiver implementando fluxo condicional para strings, pode usar condições if-else e pode usar o bloco switch case se estiver usando o Java 7 ou versões superiores. Saiba mais sobre bloco switch case para 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 encontrar todas as permutações de uma string.
Escreva uma função Java para encontrar o palíndromo mais longo em uma string dada.
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 multi-thread e usar StringBuilder
em um ambiente de thread único. O desempenho de StringBuilder
é mais rápido que o de StringBuffer
devido à ausência de sobrecarga de sincronização.
Saiba mais sobre as diferenças entre String
, StringBuffer
e StringBuilder
e a avaliação comparativa de StringBuffer e StringBuilder.
Por que é que String
é imutável em Java?
String
é imutável em Java porque oferece várias vantagens:
- 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 de banco de dados.
- Como
String
é imutável, é seguro usar em multi-threading e você não precisa de sincronização. - As strings são usadas nos carregadores de classes Java e a imutabilidade fornece a garantia de que a classe correta está sendo carregada pela classe
ClassLoader
.
Saiba mais sobre por que String
é imutável em Java.
Como você divide uma string em Java?
Você pode usar split(String regex)
para dividir a String
em uma matriz de String
com base na expressão regular fornecida.
Por que uma matriz de caracteres é preferida sobre 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 você verifica 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
além da 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
assim como 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 que seja de um pool de strings únicas.
O 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 String
é uma chave popular em HashMap
em Java?
Uma vez que um objeto String
é imutável, seu hashcode é armazenado no momento da criação e não precisa ser calculado novamente. Isso o torna um ótimo candidato para a chave em um Mapa, uma vez que seu processamento é mais rápido do que outros objetos chave de HashMap
.
Adivinhe a Saída
Teste-se adivinhando 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 o 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
O resultado é `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, 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
O resultado é `false
` porque `s2
` não é do tipo `String
`. A implementação do método equals()
na classe String
utiliza o operador instanceof
para verificar se o tipo do objeto passado é String
e retorna falso se o objeto não for do tipo String
.
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
Output
false
O resultado é `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 a 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 código a seguir?
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 valor Hello
na memória heap (terceiro objeto) e reutiliza a string Hello
do pool de strings.
Conclusão
Neste artigo, você revisou algumas perguntas de entrevista em Java especificamente sobre String
.
Leitura recomendada:
Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers