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
( s
sendo uma referência à instância / objeto)
String backup_of_s = s;
cria uma nova variável backup_of_s
e 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_s
neste caso)
Por fim, s = "bye";
cria outra instância String (por causa da imutabilidade, é a única maneira) e modifica a s
variável para que agora faça referência ao novo objeto.
s
para se referir a um objeto diferente (oString
"tchau"). Isso não afeta a que a variável de referênciabackup_of_s
está se referindo (oString
"olá"). Como eu disse, eu poderia fornecer um exemplo equivalente comStringBuilder
s, que não são imutáveis. Meu comentário é principalmente sobre a declaração de OPs: Neste ponto, a variável de backup ainda contém o valor original "olá" (isso é devido à imutabilidade de String, certo?).Strings são objetos imutáveis, então você pode copiá-los apenas copiando a referência a eles, porque o objeto referenciado não pode mudar ...
Então você pode copiar como no seu primeiro exemplo sem nenhum problema:
fonte
Sua segunda versão é menos eficiente porque cria um objeto de string extra quando simplesmente não há necessidade de fazê-lo.
Imutabilidade significa que sua primeira versão se comporta da maneira que você espera e, portanto, é a abordagem preferida.
fonte
O segundo caso também é ineficiente em termos de pool de String, você deve chamar explicitamente intern () na referência de retorno para torná-lo interno.
fonte
Que tal uma cópia assim? Eu acho que obter uma nova cópia é melhor, para que os dados de
str1
não sejam afetados quandostr2
forem referenciados e modificados em outras ações.fonte
String
é imutável. clonar Strings não faz muito sentido.