Java thì tất cả các object đều là reference tới object thực sự nằm trên heap.
khi bạn khởi tạo
String a = "abc";
String b = "abc";
thì trình biên dịch của Java sẽ đọc tất cả các object thật trước, ở đây là “abc”, tạo nó ra trên heap, rồi gắn tham chiếu của nó vào a, b. Vì vậy a, b cùng tham chiếu hay theo kiểu C là cùng trỏ tới 1 object “abc”. Vì vậy “==” so sánh tham chiếu của a và b cho kết quả true, vì a b cùng trỏ tới 1 object.
còn khi bạn viết a.substring(0, 1)
và b.substring(0, 1)
:
a.substring(0, 1)
là tham chiếu tới 1 object nằm trên heap có giá trị là “a”,
b.substring(0, 1)
là tham chiếu tới 1 object nằm trên heap cũng có giá trị là “a”,
nhưng 2 object này khác nhau (hiểu như là 2 bản copy y hệt như nhau, nhưng là 2 bản riêng biệt). Vì vậy so sánh a.substring(0, 1) == b.substring(0, 1)
cho kết quả false vì a.sub… ko trỏ tới cùng object với b.sub…