str
không phải là một đối tượng, nó là một tham chiếu đến một đối tượng. "Hello"
và "Help!"
là hai String
đối tượng riêng biệt . Do đó, str
trỏ đến một chuỗi. Bạn có thể thay đổi những gì nó trỏ tới , nhưng không phải là mà nó trỏ vào .
Lấy mã này, ví dụ:
String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"
Bây giờ, không có gì 1 chúng ta có thể làm điều s1
đó sẽ ảnh hưởng đến giá trị của s2
. Chúng đề cập đến cùng một đối tượng - chuỗi "Hello"
- nhưng đối tượng đó là bất biến và do đó không thể thay đổi.
Nếu chúng ta làm một cái gì đó như thế này:
s1 = "Help!";
System.out.println(s2); // still prints "Hello"
Ở đây chúng ta thấy sự khác biệt giữa việc đột biến một đối tượng và thay đổi một tham chiếu. s2
vẫn trỏ đến cùng một đối tượng như chúng ta đã đặt ban đầu s1
. Thiết s1
để "Help!"
chỉ thay đổi tài liệu tham khảo , trong khi String
đối tượng nó ban đầu được gọi còn lại không thay đổi.
Nếu dây là có thể thay đổi, chúng ta có thể làm điều gì đó như thế này:
String s1 = "Hello";
String s2 = s1;
s1.setCharAt(1, 'a'); // Fictional method that sets character at a given pos in string
System.out.println(s2); // Prints "Hallo"
Chỉnh sửa để đáp ứng chỉnh sửa của OP:
Nếu bạn nhìn vào mã nguồn cho String.replace (char, char) (cũng có sẵn trong src.zip trong thư mục cài đặt JDK của bạn - một mẹo chuyên nghiệp là nhìn vào đó bất cứ khi nào bạn tự hỏi làm thế nào một cái gì đó thực sự hoạt động), bạn có thể thấy đó là gì nó là như sau:
- Nếu có một hoặc nhiều lần xuất hiện
oldChar
trong chuỗi hiện tại, hãy tạo một bản sao của chuỗi hiện tại nơi tất cả các lần xuất hiện oldChar
được thay thế bằng newChar
.
- Nếu
oldChar
không có trong chuỗi hiện tại, trả về chuỗi hiện tại.
Vì vậy, có, "Mississippi".replace('i', '!')
tạo ra một String
đối tượng mới . Một lần nữa, các lưu ý sau:
String s1 = "Mississippi";
String s2 = s1;
s1 = s1.replace('i', '!');
System.out.println(s1); // Prints "M!ss!ss!pp!"
System.out.println(s2); // Prints "Mississippi"
System.out.println(s1 == s2); // Prints "false" as s1 and s2 are two different objects
Bài tập về nhà của bạn bây giờ là để xem đoạn mã trên sẽ làm gì nếu bạn đổi s1 = s1.replace('i', '!');
thành s1 = s1.replace('Q', '!');
:)
1 thực tế, nó là có thể chuỗi đột biến (và các đối tượng bất biến khác). Nó đòi hỏi sự phản chiếu và rất, rất nguy hiểm và không bao giờ nên được sử dụng trừ khi bạn thực sự quan tâm đến việc phá hủy chương trình.