Responda uma:
Uma das perguntas mais populares da entrevista sobre Java é: O que é um objeto imutável (objeto imutável), quais são os benefícios de objetos imutáveis e sob quais circunstâncias ele deve ser usado ou, mais especificamente, por que a classe String do Java deve ser definida como um? tipo imutável?
Objetos imutáveis, como o nome sugere, são objetos que não podem ser alterados após a criação. Um exemplo típico é a classe String em Java.
Copie o código do código da seguinte forma:
Strings = "ABC";
s.toLowerCase();
Como acima, s.toLowerCase() não altera o valor de "ABC", mas cria uma nova classe String "abc" e então aponta a nova instância para a variável s.
Objetos imutáveis têm muitas vantagens sobre objetos mutáveis:
1). Objetos imutáveis podem melhorar a eficiência e segurança do String Pool. Se você sabe que um objeto é imutável, quando precisar copiar o conteúdo do objeto, não será necessário copiá-lo, mas apenas seu endereço. Copiar o endereço (geralmente do tamanho de um ponteiro) requer muito pouca memória. e é muito eficiente. Não afetará outras variáveis que fazem referência a este "ABC" ao mesmo tempo.
2) Objetos imutáveis são seguros para multithreads, porque quando vários threads estão sendo executados ao mesmo tempo, o valor de um objeto mutável provavelmente será alterado por outros processos, o que causará resultados imprevisíveis, e o uso de objetos imutáveis é isso. situação pode ser evitada.
Claro, existem outros motivos, mas o maior motivo pelo qual Java define String como imutável é eficiência e segurança.
Responda dois:
Esta é uma questão antiga, mas ainda popular. Projetar String para ser imutável em Java é o resultado de levar em consideração vários fatores. Para entender esse problema, você precisa integrar considerações estruturais e de segurança. , farei um resumo de vários motivos.
1. A necessidade de um pool de constantes de string
O pool de constantes de string (pool de strings, pool interno de strings, pool de retenção de strings) é uma área de armazenamento especial na memória heap Java. Ao criar um objeto String, se o valor da string já existir no pool de constantes, ele não será criado. objeto, mas uma referência a um objeto existente.
Conforme mostrado no código a seguir, apenas um objeto String real será criado na memória heap.
Copie o código do código da seguinte forma:
String s1 = "abcd";
String s2 = "abcd";
O diagrama esquemático é o seguinte:
Se for permitido alterar o objeto string, isso levará a vários erros lógicos. Por exemplo, alterar um objeto afetará outro objeto independente, a ideia desse pool constante é um método de otimização.
Por favor, pense: se o código for o seguinte, s1 e s2 ainda apontarão para o mesmo objeto String real?
Copie o código do código da seguinte forma:
String s1= "ab" + "cd";
String s2= "abc" + "d";
Talvez esta questão seja contra-intuitiva para iniciantes, mas considerando que os compiladores modernos realizarão otimizações regulares, todos eles apontarão para o mesmo objeto no pool constante. Alternativamente, você pode usar ferramentas como jd-gui para visualizar o documento da classe compilada.
2. Permitir que objetos String armazenem em cache HashCode
O código hash de objetos String em Java é freqüentemente usado, como em contêineres como hashMap.
A imutabilidade da string garante a exclusividade do código hash, para que ele possa ser armazenado em cache com confiança. Este também é um método de otimização de desempenho, o que significa que não há necessidade de calcular um novo código hash sempre que houver o seguinte código na definição. da classe String:
Copie o código do código da seguinte forma:
private int hash; //usado para cache HashCode
3. Segurança
String é usado como parâmetro por muitas classes Java (bibliotecas), como URL de endereço de conexão de rede, caminho de arquivo e parâmetros de String exigidos pelo mecanismo de reflexão. Se String não for corrigido, causará vários riscos de segurança.
Se houver o seguinte código:
Copie o código do código da seguinte forma:
conexão booleana (string s){
if (!isSecure(s)) {
lançar nova SecurityException();
}
// Se String puder ser modificada em outro lugar, vários problemas/erros inesperados ocorrerão aqui.
causaProblema(s);
}
De modo geral, as razões pelas quais String é imutável incluem considerações de design, questões de otimização de eficiência e segurança. Na verdade, essa também é a resposta para muitos "porquês" nas entrevistas Java.
Resposta 3: Benefícios da imutabilidade da classe String
String é a classe mais comumente usada em todas as linguagens. Sabemos que em Java String é imutável e final. Java também salva um pool de String em tempo de execução, o que torna String uma classe especial.
Benefícios da imutabilidade da classe String
1. O pool de strings só é possível quando as strings são imutáveis. A implementação do pool de strings pode economizar muito espaço de heap em tempo de execução, porque diferentes variáveis de string apontam para a mesma string no pool. Mas se a string for variável, então a internação de String não será possível (Nota do tradutor: Internação de String significa que apenas uma string diferente é salva, ou seja, múltiplas strings idênticas não serão salvas.), pois neste caso, se uma variável muda seu valor, os valores das demais variáveis que apontam para esse valor também vão mudar.
2. Se a string for variável, causará sérios problemas de segurança. Por exemplo, o nome de usuário e a senha do banco de dados são passados como strings para obter a conexão com o banco de dados ou, na programação de soquete, o nome do host e a porta são passados como strings. Como uma string é imutável, seu valor não pode ser alterado, caso contrário, os hackers podem explorar brechas e alterar o valor do objeto apontado pela string, causando uma vulnerabilidade de segurança.
3. Como as strings são imutáveis, elas são seguras para vários threads e a mesma instância de string pode ser compartilhada por vários threads. Isso elimina a necessidade de usar sincronização devido a problemas de segurança de thread. As próprias strings são seguras para threads.
4. Os carregadores de classe usam strings e a imutabilidade fornece segurança para que a classe correta seja carregada. Por exemplo, se você quiser carregar a classe java.sql.Connection e esse valor for alterado para myhacked.Connection, isso causará danos desconhecidos ao seu banco de dados.
5. Como a string é imutável, o código hash é armazenado em cache quando é criado e não precisa ser recalculado. Isso torna as strings muito adequadas como chaves no Maps, e as strings podem ser processadas mais rapidamente do que outros objetos-chave. É por isso que as chaves no HashMap costumam usar strings.
O texto acima é meu resumo dos benefícios da imutabilidade das strings.