Perguntas e respostas da entrevista sobre Java String
1. Introdução
The String class é uma das classes mais amplamente usadas em Java, o que levou os designers de linguagem a tratá-la de maneira especial. Esse comportamento especial o torna um dos tópicos mais importantes das entrevistas em Java.
Neste tutorial, veremos algumas das perguntas mais comuns da entrevista sobreString.
2. String Fundamentos
Esta seção consiste em questões que dizem respeito à estrutura interna e à memória deString.
Q1. O que é uma string em Java?
Em Java, aString é representado internamente por uma matriz de valoresbyte (ou valoreschar antes do JDK 9).
Em versões até e incluindo o Java 8, aString era composto de uma matriz imutável de caracteres Unicode. No entanto, a maioria dos caracteres requer apenas 8 bits (1byte) para representá-los, em vez de 16 bits(char do tamanho).
Para melhorar o consumo de memória e o desempenho, o Java 9 introduziucompact Strings. Isso significa que se umString contiver apenas caracteres de 1 byte, ele será representado usando a codificaçãoLatin-1. Se umString contiver pelo menos 1 caractere multibyte, ele será representado como 2 bytes por caractere usando a codificação UTF-16.
Em C e C ++,String também é uma matriz de caracteres, mas em Java, é um objeto separado com sua própria API.
Q2. How Can We Create a String Object in Java?
java.lang.String define13 different ways to create a String. Geralmente, porém, existem dois:
-
Por meio de um literalString:
String s = "abc";
-
Por meio da palavra-chavenew:
String s = new String("abc");
Todos os literais String em Java são instâncias da classeString.
Q3. String é um tipo primitivo ou derivado?
A String é um tipo derivado, pois tem estado e comportamento. Por exemplo, ele tem métodos comosubstring(),indexOf() eequals(), que primitivos não podem ter.
Mas, como todos nós o usamos com tanta frequência, ele tem algumas características especiais que fazem com que pareça um primitivo:
-
Embora as strings não sejam armazenadas na pilha de chamadas como as primitivas, elas são stored in a special memory region called the string pool
-
Como primitivas, podemos usar o operador+ em strings
-
E novamente, como primitivas, podemos criar uma instância deString com a palavra-chavenew
Q4. Quais são os benefícios de Strings serem imutáveis?
De acordo coman interview de James Gosling, as strings são imutáveis para melhorar o desempenho e a segurança.
E, na verdade, vemos váriosbenefits to having immutable strings:
-
The string pool is only possible if the strings, once created, are never changed, como deveriam ser reutilizados
-
O código podesafely pass a string to another method, sabendo que não pode ser alterado por esse método
-
Imutavelmenteautomatically makes this class thread-safe
-
Uma vez que esta classe é thread-safe,there is no need to synchronize common data, que por sua vez melhora o desempenho
-
Uma vez que eles não mudam,their hashcode can be easily cached
Q5. Como uma string é armazenada na memória?
De acordo com a Especificação JVM, os literaisString são armazenados emruntime constant pool, que é alocado a partir demethod area do JVM.
Although the method area is logically part of the heap memory, the specification does not dictate the location, memory size, or garbage collection policies. Pode ser específico da implementação.
Esse conjunto constante de tempo de execução para uma classe ou interface é construído quando a classe ou interface é criada pela JVM.
Q6. As cadeias internas são elegíveis para coleta de lixo em Java?
Sim, todos osStrings no conjunto de strings são elegíveis para coleta de lixo se não houver referências do programa.
Q7. O que é String Constant Pool?
The string pool, também conhecido como pool constanteString ou pool internoString, é uma região de memória especial onde a JVM armazena instâncias deString.
It optimizes application performance reduzindo a frequência e quantas strings são alocadas:
-
A JVM armazena apenas uma cópia de um determinadoString no pool
-
Ao criar um novoString, a JVM procura no pool por umString com o mesmo valor
-
Se encontrado, o JVM retorna a referência a esseString sem alocar qualquer memória adicional
-
Se não encontrado, a JVM o adiciona ao pool (internamente) e retorna sua referência
Q8. O String Thread-Safe? How?
As strings são de fato completamente seguras para threads porque são imutáveis. Qualquer classe que seja imutável se qualifica automaticamente para thread-safety porque sua imutabilidade garante que suas instâncias não serão alteradas em vários threads.
Por exemplo, se um thread muda o valor de uma string, um novoString é criado em vez de modificar o existente.
Q9. Para quais operações de string é importante fornecer um local?
A classeLocale nos permite diferenciar entre locais culturais, bem como formatar nosso conteúdo de forma adequada.
Quando se trata deString class, precisamos dele ao renderizar sequências emformat ou quando sequências de revestimento inferior ou superior.
De fato, se esquecermos de fazer isso, podemos ter problemas com portabilidade, segurança e usabilidade.
Q10. Qual é a codificação de caracteres subjacente para strings?
According to String's Javadocs para versões até e incluindo Java 8, Strings são armazenadas no formato UTF-16 internamente.
O tipo de dadoschar e objetosjava.lang.Characterare also based on the original Unicode specification, que definiu caracteres como entidades de 16 bits de largura fixa.
Começando com JDK 9,Strings que contém apenas caracteres de 1 byte usam codificaçãoLatin-1, enquantoStrings com pelo menos 1 caractere multibyte usa codificação UTF-16.
3. A APIString
Nesta seção, discutiremos algumas questões relacionadas à APIString.
Q11. Como podemos comparar duas strings em Java? Qual é a diferença entre str1 == str2 e str1.Equals (str2)?
Podemoscompare strings de duas maneiras diferentes: usando o operador igual a (==) e usando o métodoequals().
Ambos são bem diferentes um do outro:
-
The operator (str1 == str2) checks para igualdade referencial
-
The method (str1.equals(str2)) checks para igualdade lexical
Porém, é verdade que se duas strings são lexicamente iguais, entãostr1.intern() == str2.intern() também étrue.
Normalmente, para comparar doisStrings para seu conteúdo, devemos sempre usarString.equals.
Q12. Como podemos dividir uma string em Java?
A própria classeString nos fornecethe String#split method, que aceita um delimitador de expressão regular. Ele nos retorna uma matrizString[]:
String[] parts = "john,peter,mary".split(",");
assertEquals(new String[] { "john", "peter", "mary" }, parts);
One tricky thing about split is that when splitting an empty string, podemos obter uma matriz não vazia:
assertEquals(new String[] { "" }, "".split(","));
Claro,split é apenas uma das muitas maneiras desplit a Java String.
Q13. O que é Stringjoiner?
StringJoiner é uma classe introduzida no Java 8 para juntar strings separadas em uma, comotaking a list of colors and returning them as a comma-delimited string. Nós podemos fornecer um delimitador, bem como um prefixo e sufixo:
StringJoiner joiner = new StringJoiner(",", "[", "]");
joiner.add("Red")
.add("Green")
.add("Blue");
assertEquals("[Red,Green,Blue]", joiner.toString());
Q14. Diferença entre String, Stringbuffer e Stringbuilder?
Strings são imutáveis. Isso significa queif we try to change or alter its values, then Java creates an absolutely new*String*.
Por exemplo, se adicionarmos a uma stringstr1 mais segura, ela foi criada:
String str1 = "abc";
str1 = str1 + "def";
Em seguida, a JVM, em vez de modificarstr1, cria umString inteiramente novo.
No entanto, para a maioria dos casos simples, o compilador usa internamenteStringBuildere otimiza o código acima.
Mas, para códigos mais complexos como loops,it will create an entirely new String, deteriorating performance. É aqui queStringBuildereStringBuffer são úteis.
AmbosStringBuilder and StringBuffer in Java criam objetos que contêm uma sequência mutável de caracteres. StringBuffer is synchronized and therefore thread-safe whereas StringBuilder is not.
Como a sincronização extra emStringBuffer é normalmente desnecessária, podemos frequentemente obter um aumento de desempenho selecionandoStringBuilder.
Q15. Por que é mais seguro armazenar senhas em uma matriz de caracteres em vez de em uma string?
Como as strings são imutáveis, elas não permitem modificações. This behavior keeps us from overwriting, modifying, or zeroing out its contents, making Strings unsuitable for storing sensitive information.
Temos que contar com o coletor de lixo para remover o conteúdo de uma string. Além disso, nas versões 6 e anteriores do Java, as strings eram armazenadas em PermGen, o que significa que, uma vez queString foi criado, ele nunca foi coletado como lixo.
Usando um arraychar[], temos controle total sobre essas informações. Podemos modificá-lo ou apagá-lo completamente, mesmo sem depender do coletor de lixo.
Usarchar[] sobreString não protege completamente as informações; é apenas uma medida extra que reduz uma oportunidade para o usuário mal-intencionado obter acesso a informações confidenciais.
Q16. O que o método String’s Intern () faz?
O métodointern() cria uma cópia exata de um objetoString no heap e a armazena no conjunto constanteString , que a JVM mantém.
Java internaliza automaticamente todas as strings criadas usando literais de string, mas se criarmos umString usando o novo operador, por exemplo,String str = new String(“abc”), então Java o adiciona ao heap, como qualquer outro objeto.
Podemos chamar o métodointern() para dizer à JVM para adicioná-lo ao conjunto de strings, se ainda não existir, e retornar uma referência dessa string internada:
String s1 = "example";
String s2 = new String("example");
String s3 = new String("example").intern();
assertThat(s1 == s2).isFalse();
assertThat(s1 == s3).isTrue();
Q17. Como podemos converter String em Integer e Integer em String em Java?
A abordagem mais direta paraconvert a String to an Integer é usarInteger#parseInt:
int num = Integer.parseInt("22");
Para fazer o inverso, podemos usarInteger#toString:
String s = Integer.toString(num);
Q18. O que é String.Format () e como podemos usá-lo?
String#format retorna uma string formatada usando a string de formato e os argumentos especificados.
String title = "example";
String formatted = String.format("Title is %s", title);
assertEquals("Title is example", formatted);
Também precisamos nos lembrar de especificar oLocale, unless do usuário; aceitamos simplesmente o padrão do sistema operacional:
Locale usersLocale = Locale.ITALY;
assertEquals("1.024",
String.format(usersLocale, "There are %,d shirts to choose from. Good luck.", 1024))
Q19. Como podemos converter uma string em maiúsculas e minúsculas?
String fornece implicitamenteString#toUpperCase para alterar a caixa para maiúsculas.
Porém, os Javadocs nos lembram que precisamos especificarLocale do usuário para garantir a exatidão:
String s = "Welcome to example!";
assertEquals("WELCOME TO example!", s.toUpperCase(Locale.US));
Da mesma forma, para converter para minúsculas, temosString#toLowerCase:
String s = "Welcome to example!";
assertEquals("welcome to example!", s.toLowerCase(Locale.UK));
Q20. Como podemos obter uma matriz de caracteres de String?
String fornecetoCharArray, que retorna uma cópia de sua matrizchar interna pré-JDK9 (e converte aString em uma nova matrizchar em JDK9 +):
char[] hello = "hello".toCharArray();
assertArrayEquals(new String[] { 'h', 'e', 'l', 'l', 'o' }, hello);
Q21. Como converteríamos uma string Java em um array de bytes?
Por padrão, o métodoString#getBytes() codifica uma String em uma matriz de bytes usando o conjunto de caracteres padrão da plataforma.
E embora a API não exija que especifiquemos um conjunto de caracteres,we should in order to ensure security and portability:
byte[] byteArray2 = "efgh".getBytes(StandardCharsets.US_ASCII);
byte[] byteArray3 = "ijkl".getBytes("UTF-8");
4. Algoritmos baseados emString
Nesta seção, discutiremos algumas questões de programação relacionadas aStrings.
Q22. Como podemos verificar se duas strings são anagramas em Java?
Um anagrama é uma palavra formada reorganizando as letras de outra palavra, por exemplo, "carro" e "arco".
Para começar, primeiro verificamos se ambos osStrings têm o mesmo comprimento ou não.
Então nósconvert them to char[ array, os classificamos e então verificamos a igualdade].
Q23. Como podemos contar o número de ocorrências de um determinado caractere em uma string?
O Java 8 realmente simplifica tarefas de agregação como estas:
long count = "hello".chars().filter(ch -> (char)ch == 'l').count();
assertEquals(2, count);
E existem várias outras maneiras excelentes decount the l’s também, incluindo loops, recursão, expressões regulares e bibliotecas externas.
Q24. Como podemos reverter uma string em Java?
Pode haver muitas maneiras de fazer isso, a abordagem mais direta é usar o métodoreverse deStringBuilder (ouStringBuffer):
String reversed = new StringBuilder("example").reverse().toString();
assertEquals("gnudleab", reversed);
Q25. Como podemos verificar se uma string é um palíndromo ou não?
Umpalindrome é qualquer sequência de caracteres que tem a mesma leitura para trás ou para a frente, como “madame”, “radar” ou “nível”.
Paracheck if a string is a palindrome, podemos começar a iterar a string dada para frente e para trás em um único loop, um caractere de cada vez. O loop sai na primeira incompatibilidade.
5. Conclusão
Neste artigo, analisamos algumas dasString perguntas mais comuns da entrevista.
Todos os exemplos de código usados aqui sãoavailable on GitHub.