Điều này khác với những điều sau đây như thế nào?
dòng mã này ở đây:
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
xây dựng một đối tượng String mới (tức là một bản sao của oldString
), trong khi dòng mã này:
String newString = oldString;
khai báo một biến mới của gõ java.lang.String
và khởi tạo nó để tham chiếu đến cùng một đối tượng String như biến oldString
.
Có trường hợp nào trong đó hai dòng sẽ có đầu ra khác nhau không?
Tuyệt đối:
String newString = oldString;
boolean isSameInstance = newString == oldString; // isSameInstance == true
vs
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
// isSameInstance == false (in most cases)
boolean isSameInstance = newString == oldString;
a_horse_with_no_name (xem bình luận) là đúng tất nhiên. Tương đương
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
là
String newString = new String(oldString);
trừ sự khác biệt tinh tế wrt mã hóa mà Peter Lawrey giải thích trong câu trả lời của mình.
Vâng tất nhiên, * một * Sự khác biệt là với 'Chuỗi newString = oldString;', bạn vẫn chỉ có một bản sao của chuỗi (bạn chỉ cần trỏ đến nó từ hai biến). Giải mã/mã hóa tạo một bản sao * của chuỗi. Nó không quan trọng lắm, vì 'String' là không thay đổi. Điều này có lẽ không phải là lý do tại sao mã cũ là như vậy, mặc dù; 'String' có cách trực tiếp hơn nhiều để sao chép chính nó (' String (String) '). Tôi không thể nghĩ ra lý do * tốt * tại sao bạn lại làm mã hóa/giải mã, ngoài việc kiểm tra các phương thức mã hóa/giải mã của lớp 'String'. –
Ngữ cảnh có đưa ra bất kỳ gợi ý nào về việc chuyển đổi chuỗi có thể có hoặc cần thiết không? –
@ T.J.Crowder: +1, ofcourse! Tôi không có nghĩa là sự khác biệt trong đối tượng thực tế được đề cập. Cảm ơn bạn đã chỉ ra điều đó. – OceanBlue