String s = "hello";
String backup_of_s = s;
s = "bye";
Nesse ponto, a variável de backup ainda contém o valor original "olá" (isso é devido à imutabilidade de String, certo?).
Mas é realmente seguro copiar Strings com esse método (o que obviamente não é seguro para copiar objetos mutáveis regulares) ou é melhor escrever isso? :
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 - o motivo pelo qual o primeiro trecho é seguro:
Deixe-me explicar as coisas com um pouco mais de detalhes, com base nas boas respostas já fornecidas (que foram essencialmente focadas na questão da diferença de desempenho entre os dois trechos):
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 String e atribui seu endereço a s( ssendo uma referência à instância / objeto)
String backup_of_s = s;cria uma nova variável backup_of_se a inicializa para que faça referência ao objeto atualmente referenciado por s.
Nota: A imutabilidade da string garante que este objeto não seja 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_sneste caso)
Por fim, s = "bye";cria outra instância String (por causa da imutabilidade, é a única maneira) e modifica a svariável para que agora faça referência ao novo objeto.