Ở bài trước ta đã tìm hiểu về những phương thức xử ký chuỗi. Nó là những phương thức quan trọng thường xuyên được sử dụng và kết hợp với các phương thức so sánh để đạt hiệu quả cao nhất trong một chương trình cụ thể. Và bài này ta sẽ tìm hiểu kỹ hơn về việc so sánh chuỗi trong Java

1. Các cách so sánh chuỗi trong Java

Chuỗi (String) trong Java cung cấp nhiều khái niệm đa dạng giúp ta thao tác và xử lý với chuỗi như so sánh, cắt, nối, tìm độ dài, thay thế, tìm chuỗi con, …. Trong Java, về cơ bản chuỗi là một đối tượng mà biểu diễn dãy các giá trị char. Chúng ta có thể so sánh chuỗi trong Java bằng cách dựa trên cơ sở nội dung và tham chiếu của nó.

Có 3 cách cở bản và hay được sử dụng nhất trong việc so sánh chuỗi trong Java là:

  • Sử dụng phương thức equals()
  • Sử dụng toán tử ==
  • Sử dụng phương thức compareTo()

Còn những cách khác nâng cao và ít sử dụng hơn thì các bạn có thể tự tìm hiểu thêm nhé!

2. Sử dụng toán từ == để so sánh chuỗi

Toán từ == sử dụng để so sánh tham chiếu(không phải tham trị) của 2 chuỗi. Khi ta so sánh 2 đối tượng tham chiếu theo toán tử == , có nghĩa là so sánh vị trí mà 2 đối tượng tham chiếu này trỏ tới. Về bản chất là kiểm tra xem 2 tham chiếu đó có cùng trỏ tới một thực thể trên bộ nhớ hay không.

Ví dụ:

public class Main {

    public static void main(String[] args) {

        // Chú ý: Với String 2 cách khởi tạo đối tượng dưới đây là không giống nhau:
        String str1 = "String 1";
        String str2 = new String("String 1");

        // Toán tử 'new' tạo ra vùng bộ nhớ (1)
        // chứa String "Laptrinhtudau"
        // Và 's1' là một tham chiếu trỏ đến vùng (1).
        String s1 = new String("Laptrinhtudau");

        // Toán tử 'new' tạo ra vùng bộ nhớ (2)
        // Chứa String "laptrinhtudau"
        // Và 's2' là một tham chiếu trỏ đến (2)
        String s2 = new String("laptrinhtudau");

        // Sử dụng toán tử == so sánh 's1' và 's2'.
        // Kết quả ra false.
        // Nó rõ ràng khác với suy nghĩ của bạn.
        // Lý do là với kiểu tham chiếu
        // toán tử == so sánh vị trí trên bộ nhớ mà chúng trỏ tới.
        boolean e1 = (s1 == s2); // false

        System.out.println("s1 == s2 ? " + e1);

        // Không có toán tử 'new' nào.
        // Java tạo ra một tham chiếu có tên 'obj'
        // Và trỏ tới vùng bộ nhớ mà 's1' đang trỏ tới.
        Object obj = s1;

        // 2 tham chiếu 'obj' và 's1' đang cùng trỏ tới 1 vùng bộ nhớ.
        // Kết quả trả về là true.
        boolean e2 = (obj == s1); // true

        System.out.println("obj == s1 ? " + e2);
    }
    
}

Kết quả

s1 == s2 ? false
obj == s1 ? true

3. So sánh chuỗi bằng phương thức equals()

Phương thức equals() so sánh nội dung ban đầu của chuỗi. Nó so sánh tính cân bằng của các giá trị chuỗi. Lớp String cung cấp 2 phương thức equals() để so sánh 2 chuỗi:

  • public boolean equals(Object another): so sánh 2 chuỗi có phân biệt chữ hoa, chữ thường.
  • public boolean equalsIgnoreCase(String another): so sánh 2 chuỗi không phân biệt chữ hoa, chữ thường và bỏ qua sự khác biệt về kiểu

Ví dụ:

  • Sử dụng equals
public class Main {
 public static void main(String args[]) {
  String s1 = "laptrinhtudau";
  String s2 = "laptrinhtudau";
  String s3 = new String("PHP");
  String s4 = "Java";
  System.out.println(s1.equals(s2));  
  System.out.println(s1.equals(s3));
  System.out.println(s1.equals(s4));
 }
}

Kết quả

true
false
false
  • Sử dụng equalsIgnoreCase
public class Main {
 public static void main(String args[]) {
  String s1 = "Laptrinhtudau";
  String s2 = "LAPTRINHTUDAU";
 
  System.out.println(s1.equals(s2));
  System.out.println(s1.equalsIgnoreCase(s2));
 }
}

Kết quả

false
true

4. So sánh chuỗi bằng phương thức conpareTo()

Phương thức compareTo() so sánh các giá trị theo thứ tự từ điển và trả về một giá trị số nguyên mô tả nếu chuỗi đầu tiên nhỏ hơn, bằng hoặc lớn hơn chuỗi thứ hai. Ta có thể hiểu cách nó so sánh như sau:

  • string1 > string 2 : trả về giá trị lớn hơn 0
  • string 1 < string 2 : trả về giá trị nhỏ hơn 0
  • string 1 == string 2 : trả về 0

Ví dụ:

class Teststringcomparison4{  
 public static void main(String args[]){  
   String s1="laptrinhtudau";  
   String s2="laptrinhtudau";  
   String s3="Java";  
   System.out.println(s1.compareTo(s2));
   System.out.println(s1.compareTo(s3)); 
   System.out.println(s3.compareTo(s1));
 }  
}

Kết quả

0
34
-34

5. So sánh chuỗi bằng phương thức Object.equals()

Sử dụng phương thức Object.equals() để so sánh chuỗi sẽ trả về True nếu các đối số bằng nhau và ngược lại. Nếu đối số không bằng nhau thì sẽ trả về False. Nếu cả 2 đối số đều rỗng thì kết quả trả về là True. Nếu một đối số là rỗng thì kết quả trả về là False. Mặt khác, đẳng thức được xác định bằng cách sử dụng phương thức equals() của đối số đầu tiên.

Cú pháp : public static boolean equals(Object a, Object b)

Ở đây a và b đều là các đối tượng chuỗi sẽ được so sánh.

Ví dụ:

import java.util.*;

public class Main {
    public static void main(String args[])
    {
        String string1 = new String("Lập trình từ đầu");
        String string2 = new String("Lập trình");
        String string3 = new String("Lập trình");
        String string4 = null;
        String string5 = null;

        System.out.println("So sánh " + string1 + " và " + string2
                        + " : " + Objects.equals(string1, string2));

        System.out.println("So sánh " + string2 + " và " + string3
                        + " : " + Objects.equals(string2, string3));

        System.out.println("So sánh " + string1 + " và " + string4
                        + " : " + Objects.equals(string1, string4));

        System.out.println("So sánh " + string4 + " và " + string5
                        + " : " + Objects.equals(string4, string5));
    }
}

Kết quả

So sánh Lập trình từ đầu và Lập trình : false
So sánh Lập trình và Lập trình : true
So sánh Lập trình từ đầu và null : false
So sánh null và null : true