30/09/2018, 21:38
Tại sao 2 chuỗi sau khi subString không bằng nhau
Tình hình là mình đang tìm hiểu về xâu tới khúc này thì ko biết phải giải thích ra sao
Mình có 2 xâu:
String a= "i love you"
String b = "i"
//Mình dùng substring thế này
if(a.substring(0, 1)==b.substring(0, 1)){
System.out.println("a");
}
else{
System.out.println(a.substring(0, 1));
System.out.println(b.substring(0, 1));
}
Vì sao đều cho ra kết quả là i mà sao 2 cái đó lại không bằng nhau?
Bài liên quan
bạn dùng
if(a.substring(0, 1).equals(b.substring(0, 1)))
Lệnh equals mới so sánh nội dung của String.
Xem thêm : https://mobilesprogramming.wordpress.com/2010/01/26/phan-biệt-toan-tử-va-phương-thức-equal-trong-java/
Thế cái a.substring(0, 1)==b.substring(0, 1) của mình là làm gì thế
so sánh tham chiếu, xem link dưới sẽ hiểu.
@Cu_Chuoi bạn test lại thử xem
Why String Class is made Immutable or Final in Java?
Cái này cũng tạo ra 2 đối tượng khác nhau nhưng sao vẫn ra true @@. Khó hiểu quá
Vào đây đọc nhé http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java
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
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…code C++ thế này cho “dễ” thấy 2 object substring từ 1 chuỗi là 2 object khác nhau:
trong Java các biến của object thật ra chỉ là tham chiếu tới object thực sự nằm trên heap chứ ko phải object thật sự. Hay hiểu theo C thì nó là con trỏ tới object hết. Nên so sánh a == b nghĩa là so sánh giá trị của con trỏ với nhau. Muốn so sánh giá trị của a và b thì phải xài phương thức
equals
Ok đã hiểu thanks mọi người