Hoe moet ik Strings in Java kopiëren?

Op dit moment bevat de back-upvariabele nog steeds de oorspronkelijke waarde “hallo” (dit komt door de onveranderlijkheid van String, toch?).

Maar is het echt veiligom Strings met deze methode te kopiëren (wat natuurlijk niet veilig is om gewone veranderlijke objecten te kopiëren), of is het beter om dit te schrijven? :

   String s = "hello";
    String backup_of_s = new String(s);
    s = "bye";

Met andere woorden, wat is het verschil (indien aanwezig) tussen deze twee fragmenten?


BEWERKEN – de reden waarom het eerste fragment veilig is:

Laat me de dingen uitleggen met een beetje meer detail, gebaseerd op de goede antwoorden die al zijn gegeven (die in wezen waren gericht op de kwestie van het prestatieverschil tussen de 2 fragmenten):

Strings zijn onveranderlijk in Java, wat betekent dat een String-object niet kan worden gewijzigd nadat het is gemaakt.
Daarom,

String s = "hello";maakt een nieuwe String-instantie en wijst het adres toe aan s(sis een verwijzing naar de instantie /object)

String backup_of_s = s;maakt een nieuwe variabele backup_of_saan en initialiseert deze zodat deze verwijst naar het object waarnaar momenteel wordt verwezen door s.

Opmerking: Onveranderlijkheid van strings garandeert dat dit object niet wordt gewijzigd: onze back-up is veilig

Opmerking 2: Het mechanisme voor het verzamelen van Java-afval garandeert dat dit object niet wordt vernietigd zolang ernaar wordt verwezen door ten minste één variabele (in dit geval backup_of_s)

Ten slotte, s = "bye";maakt nog een String-instantie (vanwege onveranderlijkheid is dit de enige manier) en wijzigt de variabele szodat deze nu verwijst het nieuwe object.


Antwoord 1, autoriteit 100%

Omdat strings onveranderlijk zijn, zijn beide versies veilig. Dit laatste is echter minder efficiënt (het creëert een extra object en kopieert in sommige gevallen de karaktergegevens).

Met dit in gedachten verdient de eerste versie de voorkeur.


Antwoord 2, autoriteit 17%

Strings zijn onveranderlijke objecten, dus je kunt ze kopiëren door de verwijzing ernaar toe te passen , omdat het object waarnaar wordt verwezen niet kan veranderen …

Je kunt dus zonder problemen kopiëren zoals in je eerste voorbeeld:

String s = "hello";
String backup_of_s = s;
s = "bye";

Antwoord 3, autoriteit 7%

Uw tweede versie is minder efficiënt omdat er een extra string-object wordt gemaakt wanneer dit simpelweg niet nodig is.

Onveranderlijkheid betekent dat uw eerste versie zich gedraagt zoals u verwacht en daarom de voorkeur heeft.


Antwoord 4

Het tweede geval is ook inefficiënt in termen van String-pool, je moet intern() expliciet aanroepen bij terugkeerreferentie om het intern te maken.


Antwoord 5

String str1="this is a string";
String str2=str1.clone();

Wat dacht je van zo’n kopie?
Ik denk dat het beter is om een nieuwe kopie te krijgen, zodat de gegevens van str1niet worden beïnvloed wanneer str2een referentie is en bij verdere actie wordt gewijzigd.

Other episodes