Como devo copiar Strings em Java?
String s = "hello";
String backup_of_s = s;
s = "bye";
Neste ponto, a variável de backup ainda contém o valor original "hello" (isso é devido ao direito de imutabilidade do String?).
Mas isso é realmenteseguro para copiar Strings com este método (que obviamente não é seguro para copiar objetos mutáveis regulares), ou é melhor escrever isto? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
Em outras palavras, qual é a diferença (se houver) entre esses dois trechos?
EDIT - a razão pela qual o primeiro snippet é seguro:
Deixe-me explicar as coisas com um pouco mais de detalhes, com base nas boas respostas já fornecidas (que eram essencialmente focadas na questão da diferença de desempenho entre os dois trechos):
As strings são imutáveis em Java, o que significa que um objeto String não pode ser modificado após sua construção. Conseqüentemente,
String s = "hello";
cria uma nova instância de String e atribui seu endereço as
(s
sendo uma referência para a instância / objeto)
String backup_of_s = s;
cria uma nova variávelbackup_of_s
e inicializa-o para que ele faça referência ao objeto atualmente referenciado pors
.
Nota: A imutabilidade da string garante que este objeto não será modificado: nosso backup é seguro
Nota 2: O mecanismo de coleta de lixo Java garante que este objeto não será destruído desde que seja referenciado por pelo menos uma variável (backup_of_s
nesse caso)
Finalmente,s = "bye";
cria outra instância String (por causa da imutabilidade, é a única maneira), e modifica os
variável para que agora faça referência ao novo objeto.