1. So sánh các chuỗi

Đây là tất cả tốt và tốt. Nhưng bạn có thể thấy rằng các chuỗi s1s2thực sự giống nhau, nghĩa là chúng chứa cùng một văn bản. Khi so sánh các chuỗi, làm thế nào để bạn yêu cầu chương trình không nhìn vào địa chỉ của Stringcác đối tượng mà nhìn vào nội dung của chúng?

Để giúp chúng ta làm điều này, Stringlớp của Java có equalsphương thức. Gọi nó trông như thế này:

string1.equals(string2)
So sánh hai chuỗi

Phương thức này trả về truenếu các chuỗi giống nhau và falsenếu chúng không giống nhau.

Ví dụ:

Mã số Ghi chú
String s1 = "Hello";
String s2 = "HELLO";
String s3 = s1.toUpperCase();

System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s2.equals(s3));
// Hello
// HELLO
// HELLO

false // They are different
false // They are different
true // They are the same, even though the addresses are different

Thêm ví dụ:

Mã số Giải trình
"Hello".equals("HELLO")
false
String s = "Hello";
"Hello".equals(s);
true
String s = "Hel";
"Hello".equals(s + "lo");
true
String s = "H";
(s + "ello").equals(s + "ello");
true


2. So sánh chuỗi không phân biệt chữ hoa chữ thường

Trong ví dụ trước, bạn đã thấy rằng kết quả so sánh là . Thật vậy, các chuỗi không bằng nhau. Nhưng..."Hello".equals("HELLO")false

Rõ ràng, các chuỗi không bằng nhau. Điều đó nói rằng, nội dung của chúng có các chữ cái giống nhau và chỉ khác nhau về trường hợp của các chữ cái. Có cách nào để so sánh chúng và bỏ qua trường hợp của các chữ cái không? Đó là, do đó sản lượng ?"Hello".equals("HELLO")true

Và câu trả lời cho câu hỏi này là có. Trong Java, Stringkiểu này có một phương thức đặc biệt khác: equalsIgnoreCase. Gọi nó trông như thế này:

string1.equalsIgnoreCase(string2)

Tên của phương thức tạm dịch là so sánh nhưng bỏ qua chữ hoa chữ thường . Các chữ cái trong tên của phương thức bao gồm hai dòng thẳng đứng: dòng đầu tiên là chữ thường Lvà dòng thứ hai là chữ hoa i. Đừng để điều đó làm bạn bối rối.

Ví dụ:

Mã số Ghi chú
String s1 = "Hello";
String s2 = "HELLO";
String s3 = s1.toUpperCase();

System.out.println(s1.equalsIgnoreCase(s2));
System.out.println(s1.equalsIgnoreCase(s3));
System.out.println(s2.equalsIgnoreCase(s3));  
// Hello
// HELLO
// HELLO

true
true
true


3. Ví dụ so sánh chuỗi

Hãy chỉ đưa ra một ví dụ đơn giản: giả sử bạn cần nhập hai dòng từ bàn phím và xác định xem chúng có giống nhau không. Đây là những gì mã sẽ trông như thế nào:

Scanner console = new Scanner(System.in);
String a = console.nextLine();
String b = console.nextLine();
String result = a.equals(b) ? "Same" : "Different";
System.out.println(result);

4. Một sắc thái thú vị của so sánh chuỗi

Có một sắc thái quan trọng mà bạn cần lưu ý.

Nếu trình biên dịch Java tìm thấy nhiều chuỗi giống hệt nhau trong mã của bạn (cụ thể là trong mã của bạn), thì nó sẽ chỉ tạo một đối tượng duy nhất cho chúng để tiết kiệm bộ nhớ.

String text = "This is a very important message";
String message = "This is a very important message";

Và đây là kết quả bộ nhớ sẽ chứa:

so sánh chuỗi

Và nếu bạn so sánh text == messageở đây, thì bạn nhận được true. Vì vậy, đừng ngạc nhiên bởi điều đó.

Nếu vì lý do nào đó mà bạn thực sự cần các tham chiếu khác đi, thì bạn có thể viết như sau:

String text = "This is a very important message";
String message = new String ("This is a very important message");

Hoặc cái này:

String text = "This is a very important message";
String message = new String (text);

Trong cả hai trường hợp này, các biến textmessagetrỏ đến các đối tượng khác nhau chứa cùng một văn bản.