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?

Củ Chuối viết 23:43 ngày 30/09/2018

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/

Nguyễn Văn Toàn viết 23:45 ngày 30/09/2018

Thế cái a.substring(0, 1)==b.substring(0, 1) của mình là làm gì thế

Củ Chuối viết 23:48 ngày 30/09/2018

so sánh tham chiếu, xem link dưới sẽ hiểu.

Nguyễn Văn Toàn viết 23:49 ngày 30/09/2018

String a= “abc”;
String b = “abc”;
if(a==b){
System.out.println(“a”);
System.out.println("a==b ? "+ (a==b));
}
Nhưng kết quả mình test ra true mà @@

Nguyễn Văn Toàn viết 23:50 ngày 30/09/2018

@Cu_Chuoi bạn test lại thử xem

X viết 23:54 ngày 30/09/2018

Why String Class is made Immutable or Final in Java?

Nguyễn Văn Toàn viết 23:39 ngày 30/09/2018
String a= "abc";
String b = "abc";
if(a==b){
System.out.println("a");
System.out.println("a==b ? "+ (a==b));
}

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á

X viết 23:47 ngày 30/09/2018

Vào đây đọc nhé http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java

viết 23:39 ngày 30/09/2018

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)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…

viết 23:43 ngày 30/09/2018

code C++ thế này cho “dễ” thấy 2 object substring từ 1 chuỗi là 2 object khác nhau:

const string *const string_abc = new string("abc"); //compiler tự động quét lấy các literals trước
const string *const a = string_abc; //a là con trỏ "bất động" trỏ tới chuỗi hằng "abc"
const string *const b = string_abc;
a == b; //true vì a và b cùng trỏ tới 1 object

//định nghĩa hàm substr(i, n) là
//return new string(this->begin()+i, this->begin()+i+n);
//nghĩa là tạo ra 1 string object mới nằm trên heap
const string *const ax = a->substr(0, 1);
const string *const bx = b->substr(0, 1);
ax == bx; //false vì ax và bx trỏ tới 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

Nguyễn Văn Toàn viết 23:39 ngày 30/09/2018

Ok đã hiểu thanks mọi người

Bài liên quan
0