5 perguntas complicadas da entrevista com cordas!

Neste artigo, vamos dar uma olhada nas 5 perguntas da entrevista sobre a classe Java String. Dessas cinco perguntas, eu pessoalmente experimentei algumas perguntas durante a entrevista.Este artigo o levará a entender por que as respostas a essas perguntas são verdadeiras.

 

1. Determine se st1 e st2 definidos como tipo String são iguais, por que

package string;

public class Demo2_String {

  public static void main(String[] args) {
    String st1 = "abc";
    String st2 = "abc";
    System.out.println(st1 == st2);
    System.out.println(st1.equals(st2));
  }

}

Resultado de saída:

Primeira linha: true

Segunda linha: true 

Análise:

Primeiro, observe a primeira declaração de impressão. Em Java, == este símbolo é um operador de comparação. Ele pode verificar se o tipo de dados básico e o tipo de dados de referência são iguais. Se é um tipo de dados básico, == compara se o valor é igual, se é uma referência. O tipo de dados == compara se os endereços de memória dos dois objetos são iguais.

A string não pertence ao tipo de dados básico em 8, o objeto string pertence ao tipo de dados de referência, "abc" é atribuído aos dois objetos string st1 e st2 ao mesmo tempo, apontando para o mesmo endereço, portanto, a primeira impressão A saída de comparação == na instrução é verdadeira

A seguir, analisamos a comparação de iguais na segunda declaração de impressão, e sabemos que igual é um método da classe pai de Object, e esse método igual é reescrito na classe String.

Localize o método equals na classe String no documento JDK API 1.6, clique para ver a frase "Compare esta string com o objeto especificado. Se e somente se o parâmetro não for null, e o mesmo caractere desse objeto O String resultado é apenas quando o objeto é uma  sequência true. "Observe que essa mesma sequência de caracteres, a comparação de duas matrizes, listas e dicionários introduzidos posteriormente serão implementadas por essa lógica para escrever código.

Como os valores de st1 e st2 são "abc", os dois apontam para o mesmo objeto e a sequência de caracteres atual é a mesma, portanto o resultado da impressão da segunda linha também é verdadeiro. 

Vamos desenhar um gráfico de memória para representar o código acima, que parece mais convincente.

O processo de memória é mais ou menos o seguinte:

1) Execute primeiro para compilar e, em seguida, carregue o arquivo Demo2_String.class atual na área de método da memória

2) Na segunda etapa, o método principal é inserido na memória da pilha

3) O pool constante cria um objeto "abc" e gera um endereço de memória

4) Em seguida, atribua o endereço de memória "abc" à variável de membro st1 no método principal.Neste momento, st1 aponta para "abc" no pool constante de acordo com o endereço de memória.

5) Como mencionado no artigo anterior, o pool constante possui esse recurso: se ele existir, ele não criará objetos duplicados.

6) Execute o código Stringst2 = "abc", porque o conjunto constante possui "abc", para que não seja criado novamente e o endereço de memória "abc" seja diretamente atribuído ao st2

7) Finalmente, st1 e st2 apontam para o mesmo endereço na memória, portanto os dois são idênticos.

 

2. A frase a seguir cria vários objetos na memória

String st1 = new String(“abc”);

A resposta é: Crie dois objetos na memória, um na memória heap e um no pool constante.O objeto de memória heap é uma cópia do objeto de pool constante. Além disso, preste atenção à conta pública do WeChat: pilha de tecnologia Java, responda em segundo plano: entrevista, você pode obter as N perguntas mais recentes sobre entrevistas em Java que colecionei, todas são produtos secos.

Análise:

Vamos diretamente para um mapa de memória abaixo.

Quando vemos a palavra-chave new, devemos pensar que os objetos que saem do new são todos armazenados na memória heap. Em seguida, explicamos por que os objetos no heap são cópias de objetos no pool constante.

"Abc" é uma sequência e a sequência é uma constante, portanto deve ser criada no conjunto de constantes, para que o primeiro objeto criado seja "abc" no conjunto de constantes.

O segundo objeto é uma cópia da cópia na memória heap, o que requer uma observação sobre o construtor String (String original) na API JDK 1.6: inicialize um String objeto recém-criado  para que ele represente um parâmetro com o mesmo Sequência de caracteres; em outras palavras, a sequência recém-criada é uma cópia da sequência de parâmetros.

Então, a resposta saiu, dois objetos. 

3. Determine se os seguintes st1 e st2 definidos como tipos de String são iguais 

package string;
public class Demo2_String {
   public static void main(String[] args) {
     String st1 = new String("abc");
     String st2 = "abc";
     System.out.println(st1 == st2);
     System.out.println(st1.equals(st2));
   }
}

Resposta: falso e verdadeiro

Devido às duas experiências e teorias anteriores sobre análise de memória, posso obter rapidamente a resposta acima.

== Compare os endereços de memória dos objetos st1 e st2.Como st1 aponta para o endereço da memória heap, st2 vê que “abc” já existe no pool constante, portanto não será criado novamente, portanto st2 aponta para o endereço de memória do pool constante Então == resultado do resultado da saída false, os dois não são iguais.

A segunda comparação é igual , a comparação é se as duas seqüências de seqüência de caracteres são iguais, porque há apenas um "abc", portanto são completamente iguais.

O mapa de memória é o seguinte

 

4. Determine se os seguintes st1 e st2 definidos como tipos de String são iguais

package string;
 
public class Demo2_String {
 
   public static void main(String[] args) {
     String st1 = "a" + "b" + "c";
     String st2 = "abc";
     System.out.println(st1 == st2);
     System.out.println(st1.equals(st2));
   }
}

A resposta é: verdadeira e verdadeira 

Análise:

Os três "a", "b", "c" são originalmente constantes de seqüência de caracteres e, depois que o sinal + é unido, eles se tornam "abc". "Abc" é uma constante de seqüência de caracteres (existe um mecanismo de otimização constante em Java), portanto, constantes Chi Lima criará um objeto constante de cadeia de caracteres de "abc", st2 = "abc", neste momento, há "abc" no pool constante, portanto, ele não será mais criado. Portanto, se você comparar endereços de memória ou seqüências de strings, todas são iguais. 

5. Determine se os seguintes st2 e st3 são iguais

package string;
 
public class Demo2_String {
 
   public static void main(String[] args) {
     String st1 = "ab";
     String st2 = "abc";
     String st3 = st1 + "c";
     System.out.println(st2 == st3);
     System.out.println(st2.equals(st3));
   }
}

Resposta: falso e verdadeiro

Análise:

A primeira resposta é falsa, a segunda é verdadeira e a segunda é verdadeira.Entendemos muito bem, porque a comparação é "abc" e a outra é "abc" obtida por costura, então é igual a comparação, esta é a saída verdade, entendemos muito bem.

Portanto, o primeiro julgamento é por que é falso, estamos muito intrigados. Da mesma forma, abaixo, usamos anotações da API e mapas de memória para explicar por que isso não é igual. 

Primeiro, abra a introdução de String na API 1.6 do JDK e encontre a frase na figura abaixo.

O ponto principal é a sentença no círculo vermelho. Sabemos que quaisquer dados e cadeias são mais (+), e o resultado é uma nova cadeia. O que exatamente a operação + faz? Recomende dar uma olhada. Preste atenção à conta pública do WeChat: pilha de tecnologia Java, responda em segundo plano: java, você pode obter os N tutoriais mais recentes sobre Java que eu compilei, todos são produtos secos.

O comentário acima mostra que o princípio dessa emenda é alcançado pela classe StringBuilder ou StringBuffer e pelo método append dentro, depois toString () é chamado para converter o objeto emendado em um objeto de string e, finalmente, o endereço do objeto de string obtido é atribuído a uma variável.

Combinado com esse entendimento, desenhamos um gráfico de memória para analisar.

Processo aproximado de memória

1) O pool constante cria um objeto "ab" e o atribui a st1; portanto, st1 aponta para "ab"

2) O pool constante cria um objeto "abc" e o atribui a st2, portanto st2 aponta para "abc"

3) Devido ao método de emenda + adotado aqui, a terceira etapa é usar o método append da classe StringBuffer para obter "abc". Neste momento, a memória 0x0011 indica um objeto StringBuffer. Observe que não é um objeto String.

4) Chamado o método toString de Object para substituir o objeto StringBuffer por um objeto String.

5) Atribuir objeto String (0x0022) a st3 

Portanto, os resultados do julgamento st = e st2 == não são iguais, porque os endereços de memória dos dois objetos são diferentes.

Resumo:

Esta pergunta da entrevista é completamente necessária para dominar algumas anotações e princípios na API do JDK, bem como a análise do mapa de memória para obter os resultados corretos.Eu admito que desenhar o mapa de memória me permite entender por que a resposta é assim.

Depois de desenhar o mapa da memória, obtenha a resposta, você o achará muito interessante e, finalmente, haverá um lamento.

Autor: Anthony_tester

https://blog.csdn.net/u011541946/article/details/79865160 

FIM

Materiais de aprendizagem:

Compartilhe uma cópia dos mais recentes materiais de aprendizado do arquiteto Java

Artigos recentes:

1. Método de escrita Java 10 big pack B, você pode se gabar!

2. Correspondência de padrões Java 14, recurso muito novo!

3. Pesado: o Java 14 é lançado oficialmente!

4. Você ainda está usando o Date? Use rapidamente LocalDateTime!

5. Um caso sangrento causado pelo vazamento do pool de conexão do Druid!

6. 8 estruturas de dados que todo programador deve dominar!

7. As 8 maneiras de escrever o modo singleton são muito completas!

8. Como usar o chase MM para entender 23 padrões de design?

9. Quando vou, meu colega realmente armazena a senha em texto sem formatação! ! !

10. Por que as grandes empresas precisam usar microsserviços?

Há muitos produtos secos na conta pública.Leia o código para prestar atenção à conta pública da pilha da tecnologia Java .

Clique em " Ler original " para levá-lo a voar ~

Publicado 474 artigos originais · elogiou 1030 · 1,45 milhão de visualizações +

Acho que você gosta

Origin blog.csdn.net/youanyyou/article/details/105463032
Recomendado
Clasificación