String s = "hello";
String backup_of_s = s;
s = "bye";
ณ จุดนี้ตัวแปรสำรองยังคงมีค่าเดิม "hello" (นี่เป็นเพราะการเปลี่ยนรูปแบบของสตริงใช่ไหม?)
แต่มันปลอดภัยที่จะคัดลอก Strings ด้วยวิธีนี้ (ซึ่งแน่นอนว่าไม่ปลอดภัยในการคัดลอกวัตถุที่ไม่แน่นอนปกติ) หรือดีกว่าที่จะเขียนสิ่งนี้? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
กล่าวอีกนัยหนึ่งความแตกต่าง (ถ้ามี) ระหว่างตัวอย่างสองรายการนี้คืออะไร
แก้ไข - สาเหตุที่ข้อมูลโค้ดแรกปลอดภัย:
ให้ฉันอธิบายสิ่งต่าง ๆ โดยมีรายละเอียดเล็ก ๆ น้อย ๆ ตามคำตอบที่ดีที่ได้ให้ไปแล้ว (ซึ่งมุ่งเน้นไปที่คำถามของความแตกต่างของประสิทธิภาพระหว่าง 2 ตัวอย่าง)
สตริงไม่เปลี่ยนรูปใน Java ซึ่งหมายความว่าวัตถุ String ไม่สามารถแก้ไขได้หลังจากการก่อสร้าง ดังนั้น
String s = "hello";สร้างอินสแตนซ์ของสตริงใหม่และกำหนดที่อยู่ให้กับs( sเป็นการอ้างอิงไปยังอินสแตนซ์ / วัตถุ)
String backup_of_s = s;สร้างตัวแปรใหม่และเริ่มต้นเพื่อที่จะอ้างอิงวัตถุที่อ้างถึงในขณะนี้โดยbackup_of_ss
หมายเหตุ: สตริงที่ไม่สามารถเปลี่ยนแปลงได้รับประกันว่าวัตถุนี้จะไม่ถูกแก้ไข: การสำรองข้อมูลของเราปลอดภัย
หมายเหตุ 2: กลไกการรวบรวมขยะ Java รับประกันว่าวัตถุนี้จะไม่ถูกทำลายตราบใดที่มีการอ้างอิงโดยตัวแปรอย่างน้อยหนึ่งตัว ( backup_of_sในกรณีนี้)
ในที่สุดs = "bye";สร้างอินสแตนซ์ของสตริงอื่น (เนื่องจากความไม่สามารถเปลี่ยนได้มันเป็นวิธีเดียว) และปรับเปลี่ยนsตัวแปรเพื่อให้มันอ้างอิงวัตถุใหม่ในขณะนี้