String detalhada em Java
String: Conjunto de constantes de string
Perguntas da entrevista (veja o vídeo da estação b)
1. Não posso usar volatile com String?
2. Por que existem essas duas maneiras? Por causa de suas diferentes áreas de armazenamento
3. A camada inferior da String é uma matriz do tipo char
1. Três características da corda
1.1. Imutabilidade
1.1.1. String é um objeto em modo imutável. A principal função do modo invariável é garantir a consistência dos dados quando um objeto precisa ser compartilhado por vários threads e acessado com frequência.
1.2, otimização de pool constante
1.2.1 Após a criação do objeto String, ele será armazenado em cache no pool de constantes da string e a referência em cache será retornada diretamente quando o mesmo objeto for criado na próxima vez.
1,3 、 final
1.3.1. A classe String não pode ser herdada, o que melhora a segurança do sistema.
2. Existem três maneiras de instanciar String ():
2.1, atribuição direta
2.2. Por meio do construtor, o valor da string pode ser passado diretamente, ou um array char pode ser passado.
2.3. Por meio do construtor, você pode passar diretamente uma matriz do tipo char
A diferença entre os dois (área de armazenamento): a atribuição direta é armazenada no conjunto de constantes da string e, ao construir uma instância, é armazenada no heap.
3. Resumo dos sites de teste de entrevista
3.1, String não é um tipo de dados básico
A camada inferior da String é na verdade uma matriz do tipo char
3.2, a instanciação de String
3.3, método igual
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value) :
StringUTF16.equals(value, aString.value);
} }
return false;
}
3.3.1. O método equals em Object é o mesmo que "==".
3.3.2. String reescreve o método igual em Object. A comparação não é mais o valor do endereço, mas seu valor ().
3.4, String é imutável
3.4.1. Enquanto o valor de String é alterado, ele se torna um novo objeto
3.5, método intern ()
3.5.1. Quando o objeto String chama o método intern (), ele irá para o pool de constantes de string para encontrar o valor; se o valor existir, uma referência ao valor será retornada; se ele não existir, um novo um será criado no valor e retorno de endereço do pool de constantes de string.
Quatro métodos comumente usados
4.1, corte de corda
4.1.1, o método split () suporta expressões regulares
Cinco, entrevistar perguntas clássicas
5.1 Qual é a diferença entre == e iguais?
5.1.1. "==" é comparado a partir da classificação do tipo de dados, se o tipo de dados básico é comparado, é o valor de comparação; se o tipo de dados de referência é comparado, é o valor do endereço na memória.
5.1.2, equals é o método fornecido por Object e "==" é o mesmo, mas String o reescreve e compara seu valor, não o valor do endereço na memória.
5.2. O resultado da execução do seguinte código é:
String str1 = "Hello World";
String str2 = "Hello";
str2 += " World";
System.out.println(str1 == str2);
Você pode usar o comando javap -c xx.class para ver a ordem de execução.No processo, há um novo StringBuilder (); método append, então str2 aparece no heap e o resultado é falso;
5.3. O resultado da execução do seguinte código é:
String str1 = "Hello World";
final String str2 = " World";
String str3 = "Hello" + str2;
System.out.println(str1 == str3);
Se o resultado for verdadeiro, a modificação final será diretamente compilada em um valor explícito e a modificação final não será compilada em um valor explícito.
Referência: a diferença entre variáveis String modificadas finais e variáveis String não modificadas em java
5.4. O resultado da execução do seguinte código é:
String str1 = "Hello World";
final String str2 = new String(" World");
String str3 = "Hello"+str2;
System.out.println(str1 == str3);
Se o resultado for falso, ele é modificado por final, mas foi criado primeiro na memória heap, então, não importa se foi modificado por final ou não, ele está sempre na memória heap.
5.5. O resultado da execução do seguinte código é:
String str1 = "Hello World";
String str2 = "Hello";
String str3 = " World";
String str4 = str2 + str3;
System.out.println(str4 == str1);
System.out.println(str4.intern() == str1);
O resultado é: falso, verdadeiro. Porque o método intern (); de String procura primeiro pelo pool de constantes de string, retorna a referência se houver uma e a cria no pool de constantes se não houver.
5.6, o papel do pool constante de string
Vários valores idênticos podem compartilhar um valor de endereço. Pode reduzir o consumo de memória.
5.7. O thread da String é seguro?
Sim, o valor é imutável, desde que o valor mude, é um novo valor de endereço.
5.8. Quais são as vantagens de usar String como chave ao usar HashMap?
Como o HashMap encontra o valor de acordo com o hashcode da chave, a String é armazenada em cache quando é criada. Portanto, no HashMap, não há necessidade de calcular o hashcode, ele está no cache e a eficiência é maior do que em outros objetos.