1. Em primeiro lugar, String não pertence aos 8 tipos básicos de dados. String é um objeto.
Como o valor padrão de um objeto é nulo, o valor padrão de String também é nulo, mas é um objeto especial e possui algumas características que outros objetos não possuem;
2. new String() e new String("") declaram uma nova string vazia, que é uma string vazia e não nula;
3. String str="kvill";
A diferença entre String str=new String ("kvill");:
Aqui, não falaremos sobre heap ou pilha, mas simplesmente introduziremos o conceito simples de pool constante.
O pool constante refere-se ao pool que é determinado em tempo de compilação e armazenado no pool compilado. Alguns dados no arquivo de classe. Inclui constantes em classes, métodos, interfaces, etc., bem como constantes de string.
Veja o exemplo 1:
Copie o código do código da seguinte forma:
String s0="kvill";
String s1="kvill";
String s2="kv" + "ill";
System.out.println( s0==s1 );
System.out.println( s0==s2 );
O resultado é:
verdadeiro
verdadeiro
Primeiro, precisamos saber que Java garantirá que haja apenas uma cópia de uma constante de string.
Como "kvill" em s0 e s1 no exemplo são constantes de string, elas são determinadas em tempo de compilação, então s0==s1 é verdadeiro e "kv" e "ill" também são constantes de string. Quando uma string é concatenada por; múltiplas constantes de string, ele próprio deve ser uma constante de string, então s2 também é analisado em uma constante de string em tempo de compilação, então s2 também é um dos "kvill" na citação do conjunto de constantes.
Então obtemos s0==s1==s2;
Strings criadas com new String() não são constantes e não podem ser determinadas em tempo de compilação, portanto, strings criadas com new String() não são colocadas no conjunto de constantes, elas têm seu próprio espaço de endereço.
Veja o exemplo 2:
Copie o código do código da seguinte forma:
String s0="kvill";
String s1=new String("kvill");
String s2="kv" + new String("ill");
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
O resultado é:
falso
falso
falso
No Exemplo 2, s0 ainda é a aplicação de "kvill" no conjunto de constantes. Como s1 não pode ser determinado em tempo de compilação, é uma referência ao novo objeto "kvill" criado em tempo de execução. ("ill"), também não pode ser determinado em tempo de compilação, portanto também é uma aplicação de um objeto "kvill" recém-criado. Se você entender isso, saberá por que esse resultado é obtido.
4.String.intern():
Deixe-me acrescentar mais um ponto: existe em. O conjunto constante no arquivo de classe é carregado pela JVM durante o tempo de execução e pode ser expandido. O método intern() de String é um método para expandir o pool de constantes; quando uma instância de String str chama o método intern(), Java verifica se há uma constante de string com o mesmo Unicode no pool de constantes. sua referência. Se não, adicione uma string Unicode igual a str no conjunto de constantes e retorne sua referência, ficará claro olhando o Exemplo 3. Exemplo 3:
Copie o código do código da seguinte forma:
String s0= "kvill";
String s1=new String("kvill");
String s2=new String("kvill");
System.out.println( s0==s1 );
System.out.println("**********");
s1.interno();
s2=s2.intern(); //Atribuir a referência de "kvill" no pool constante para s2
System.out.println(s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
O resultado é:
falso
**********
false //Embora s1.intern() seja executado, seu valor de retorno não é atribuído a s1
true //Indica que s1.intern() retorna uma referência a "kvill" no pool de constantes
verdadeiro
Finalmente, deixe-me dissipar outro mal-entendido:
Alguém disse: "Use o método String.intern() para salvar uma classe String em uma tabela String global. Se uma string Unicode com o mesmo valor já estiver nesta tabela, então este método retorna a string que já está na tabela. endereço, se não houver nenhuma string com o mesmo valor na tabela, registre seu próprio endereço na tabela "Se eu entendi a tabela String global ele disse como um pool constante, sua última frase, "If in If there is no string with the. mesmo valor na tabela, é errado registrar seu próprio endereço na tabela:
Veja o exemplo 4:
Copie o código do código da seguinte forma:
String s1=new String("kvill");
String s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println(s1+" "+s2 );
System.out.println( s2==s1.intern() );
O resultado é:
falso
kvill kvill
verdadeiro
Nesta classe, não declaramos uma constante "kvill", portanto não havia "kvill" no conjunto de constantes no início. Quando chamamos s1.intern(), uma nova constante "kvill" foi adicionada ao conjunto de constantes. Acontece que o "kvill" que não está no pool constante ainda existe, o que significa que não está "registrando seu próprio endereço no pool constante".
s1==s1.intern() é falso, indicando que o "kvill" original ainda existe;
s2 agora é o endereço de "kvill" no pool de constantes, então s2==s1.intern() é verdadeiro.
5. Sobre equals() e ==:
Para String, isso é simplesmente para comparar se as sequências Unicode de duas strings são equivalentes e retornar verdadeiro se forem iguais e == é para comparar se os endereços das duas strings são iguais, ou seja, se são referências; para a mesma cadeia.
6. Sobre String é imutável
Há muito a dizer sobre isso. Contanto que você saiba que uma instância de String não mudará depois de gerada, por exemplo: String str="kv"+"ill"+" "+"ans";
Existem 4 constantes de string. Primeiro, "kv" e "ill" geram "kvill" que é armazenado na memória. Finalmente, "kvill" é combinado com "" para gerar "kvill". é combinado com "kvill ans" para gerar "kvill ans" e atribuir o endereço desta string a str, pois a "imutabilidade" de String gera muitas variáveis temporárias, por isso é recomendado usar StringBuffer, porque StringBuffer é mutável.