http://kohlerm.blogspot.co.uk/2009/01/is-javalangstringintern-really-evil.html
afirma que String.equals()
costuma "=="
comparar String
objetos antes, de acordo com
http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
ele compara os comprimentos de Strings e, em seguida, o conteúdo.
(A propósito, as sequências de código de produto em um catálogo de vendas podem ter o mesmo comprimento - o BIC0417 é o capacete de segurança de um ciclista, o TIG0003 é um tigre adulto masculino - você provavelmente precisará de todos os tipos de licenças para solicitar um deles. talvez seja melhor encomendar um capacete de segurança ao mesmo tempo.)
Portanto, parece que você se beneficia de substituir o Strings pela intern()
versão deles , mas obtém segurança - e legibilidade e conformidade padrão - sem usar o uso de "==" equals()
na sua programação. E a maior parte do que vou dizer depende disso, se for verdade.
Mas String.equals()
teste se você passou uma String e não outro objeto antes de usar "=="
? Não estou qualificado para dizer, mas acho que não, porque a maioria dessas equals()
operações será String a String, de modo que o teste é quase sempre passado. De fato, priorizar "==" por dentro String.equals()
implica a confiança de que você frequentemente está comparando a String ao mesmo objeto real.
Espero que ninguém fique surpreso que as seguintes linhas produzam um resultado "falso":
Integer i = 1;
System.out.println("1".equals(i));
Mas se você mudar i
para i.toString()
a segunda linha, é claro que é true
.
Locais onde você pode esperar um benefício com a internação incluem Set
e Map
, obviamente. Espero que as strings internas tenham seus hashcodes em cache ... Eu acho que isso seria um requisito. E espero não ter revelado apenas uma idéia que poderia me render um milhão de dólares. :-)
Quanto à memória, também é óbvio que esse é um limite importante se o seu volume de Strings for grande ou se você desejar que a memória usada pelo código do programa seja muito pequena. Se o seu volume de -distinct- Strings for muito grande, talvez seja hora de considerar o uso de código de programa de banco de dados dedicado para gerenciá-los e um servidor de banco de dados separado. Da mesma forma, se você pode melhorar um programa pequeno (que precisa ser executado em 10000 instâncias simultaneamente), ele não armazena suas próprias Strings.
Parece um desperdício criar uma nova String e descartá-la imediatamente por seu intern()
substituto, mas não há uma alternativa clara, exceto por manter a String duplicada. Então, na verdade, o custo de execução é procurar sua string no pool interno e permitir que o coletor de lixo descarte a original. E se é uma string literal, ela já está internada de qualquer maneira.
Eu estou querendo saber se intern()
pode ser abusado por código de programa malicioso para detectar se alguma String e suas referências de objeto já existem no intern()
pool e, portanto, existem em outros lugares da sessão Java, quando isso não deveria ser conhecido. Mas isso só seria possível quando o código do programa já estiver sendo usado de maneira confiável, eu acho. Ainda assim, é algo a considerar sobre as bibliotecas de terceiros que você inclui no seu programa para armazenar e lembrar seus números de PIN do caixa eletrônico!