"Paulo S. L. M. Barreto" wrote:
> 
> Uma alternativa geralmente mais eficiente é usar:
> 
> if (str1.intern() == str2.intern()) {
>     /* ... */
> }
> 
> já que é feita apenas uma comparação de endereços, e não de conteúdo.
> Obviamente é melhor invocar o método intern() uma só vez e trabalhar apenas
> com o resultado.
> 
> Paulo.

PERIGO!

A frase "geralmente mais eficiente" depende de que geralmente...

O processo causado por "String.intern()" eh o de transformar a
String em uma das Strings constantes do "pool" de string do seu
programa. O que significa que duas Strings com o mesmo conteudo
(str1.equals(str2)) apontarao para o mesmo endereco (o que nao
eh verdade na maior parte das vezes). O processo de "intern" uma
String pode ser demorado, em especial se voce possui varias strings
no seu pool, ja que a sua string a ser "internalizada" precisa ser 
comparada com varias Strings no pool. Portanto, o processo acima
so eh valido se essa comparacao entre dois valores de String
for ser feita repetidas vezes, o que _em geral_ nao eh o caso
nas aplicacoes.

Uma vez que voce esta tratando duas Strings que fazem parte do
pool, a comparacao eh de fato mais rapida, ja que envolve, como
foi dito, uma comparacao de referencias. O problema eh fazer
disso a pratica usual, achando que isso eh mais performatico, e
isso _nao_eh_verdade_. 

Na verdade, fazendo disso uma pratica usual, voce passara a ter mais 
e mais Strings constantes do pool, o que eh prejudicial por dois
motivos: a String "intern" _nao_eh_eliminada_ pelo garbage collector,
e portanto voce passa a ter maiores requerimentos de memoria para
executar o seu programa, e em segundo lugar, quanto mais strings voce
tiver no pool, mais demorado sera para voce fazer um "intern" e
menores sao as chances desse processo ser mais performatico.

Uma outra resalva eh nao se acostumar a usar o metodo "equals" e
acabar esquecendo o "intern" alguma vez, e voce tera a comparacao
errada. Portanto, utilize sempre o "equals" e, se voce identificar
uma situacao onde duas strings sao constantemente comparadas,
voce pode decidir usar o "intern".

Fora isso, o metodo de comparacao indicado esta correto.

[]s, 

Bruno.
______________________________________________________________________
Bruno Peres Ferreira de Souza                         Sun Microsystems
System Engineer - Java Technologist         [EMAIL PROTECTED]
        if I fail, if I succeed, at least I live as I believe

    --------------------------- LISTA SOUJAVA ---------------------------
    http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP
    [para sair da lista: http://www.soujava.org.br/forum/cadastrados.htm]
    ---------------------------------------------------------------------

Responder a