menu

VanThuong.Com

Blog học lập trình Java và SEO miễn phí.

String Comparison - So sánh chuỗi trong Java

Posted by on
Trong một bài viết trước tôi đã có giới thiệu đến các bạn String class trong Java. Chúng ta sẽ rất thường xuyên làm việc với nó khi phát triển ứng dụng trên Java. Bên cạnh đó, so sánh chuỗi trong Java cũng là một trong những loại câu hỏi phỏng vấn (Interview Question) rất là phổ biến. Không ít bằng hữu giang hồ của mình khi đi tỉ võ ở các công ty đã bị cao thủ dập lên bờ xuống ruộng cũng chỉ liên quan đến sờ-tring (String).
String Comparison - So sánh chuỗi trong Java

Ví dụ để phân biệt String literal và String object by new
String name = "abc"; // String object by literal
String surename = new String("abc"); // String object by new

Trong Java, khi so sánh hai chuỗi có bằng nhau hay không bằng toán tử bằng (==) là một lỗi rất cơ bản. Đây là một trong những mistake thường bắt gặp ở những người mới bắt đầu làm quen với ngôn ngữ Java. Chính vì có String literalString object by new nên việc so sánh bằng toán tử (==) hoặc (!=) sẽ dễ dẫn đến sai lệch toàn bộ business logic của chương trình. Vì sao lại như vậy?

Trong thực tế, toán tử "==" sẽ trả về kết quả true nếu như cả hai toán hạng trỏ đến cùng một object. Trong trường hợp của String literal, nó sẽ trả về kết quả true khi thực hiện so sánh nếu như String pool trả về cùng một String object được tạo dưới dạng chuỗi literal. Ngược lại, kết quả sẽ là false nếu như 2 String đang so sánh không nằm trong cùng pool hoặc chỉ có 1 trong 2 được tạo dưới dạng chuỗi literal.

Để tránh được lỗi tế nhị này, String class cung cấp cho chúng ta các phương thức như: equals(), equalsIgnoreCase(), compareTo() để so sánh chuỗi trong Java. Bạn nên sử dụng equals(), bởi nó sẽ trả về true nếu như cả 2 đối tượng String chứa các ký tự chính xác như nhau ngược lại sẽ trả về false.
Ví dụ
String name1 = "John";
String name2 = "john";
String name3 = new String("abc");
System.out.println(name1.equals(name2)); // false
System.out.println(name1.equals(name3)); // false
System.out.println(name2.equals(name3)); // false
System.out.println("John".equals(name1)); // true

Nếu như bạn muốn so sánh hai chuỗi mà không phân biệt hoa thường thì bạn hãy sử dụng phương thức equalsIgnoreCase() sẵn có của String class. Ví dụ, nếu như bạn so sánh "vanthuong.com" với "VanThuong.Com" bằng phương thức equasl() thì nó sẽ trả về kết quả false, nhưng nếu như sử dụng equalsIgnoreCase() thì kết quả sẽ là true.

Ví dụ
String str1 = "vanthuong";
String str2 = "VanThuong";
String str3 = new String("abc");
String str4 = new String("VaNtHuOng");
System.out.println(str1.equalsIgnoreCase(str2)); // true
System.out.println(str1.equalsIgnoreCase(str3)); // false
System.out.println(str1.equalsIgnoreCase(str4)); // true
System.out.println("VANTHUONG".equalsIgnoreCase(str1)); // true

Giả sử bạn cần so sánh nhiều String object với nhau theo thứ tự alphabet thì bạn có thể sử dụng phương thức compareTo(). Phương thức này sẽ trả về số dương, số âm, số 0 tùy thuộc vào chuỗi mà phương thức này được gọi. Ví dụ, trong trường hợp so sánh 2 chuỗi "Java" và "C#" bằng operation như sau: "Java".compareTo("C#") thì nó sẽ trả về kết quả là một số dương. Nếu thay đổi vị trí của 2 chuỗi thì nó sẽ trả về là một số âm.

Dưới đây là một ví dụ đầy đủ về các cách so sánh trong Java mà bạn có thể tham khảo để làm rõ hơn về những điều mà tôi đã chia sẻ ở trên.

package com.vanthuong.example;

/**
 * Official blog: http://www.vanthuong.com
 * Learn and share your java knowledge
 */
public class StringComparisionExample {
  public static void main(String args[]) {
    String name = "abc";
    String surname = "abc";

    // Kết quả là true bởi vì name và surname đều trỏ đến cùng string object
    if (name == surname) {
      System.out.println("Two Strings are equal by == because they cached in string pool");
    }

    surname = new String("abc");

    // Kết quả của phép so sanh là false bởi vì surname
    // lúc này không còn là String literal nữa mà là một object hoàn toàn khác
    if (name == surname) {
      System.out.println("String literal and String created with new() are equal using ==");
    } else {
      System.out.println("String literal and String created with new() are not equal using ==");
    }

    // Kết quả là true bởi vì content của 2 String này giống nhau
    if (name.equals(surname)) {
      System.out.println("Two Strings are equal");
    } else {
      System.out.println("Two Strings are not equal");
    }
    
    // String literal nên đặt trước equals() khi so sánh để tránh NullPointerException
    String a = "Java";
    if ("Java".equals(a)){
      System.out.println("Right way of using equals() method with String literal");
    }

    String b = "JAVA";
    if (a.equalsIgnoreCase(b)){
      System.out.println("equalsIgnoreCase is used to perform case insensitive comparison");
    }

    String c = "C++";
    if (a.compareTo(c) > 1) {
      System.out.println(a + " comes after " + c + " in alphabetical order");

    } else if (a.compareTo(c) < -1) {
      System.out.println(a + " comes before " + c + " in alphabetical order");

    } else {
      System.out.println(a + " and " + c + " are equal to each other");
    }
  }
}

Như vậy là chúng ta vừa tìm hiểu xong về cách so sánh chuỗi trong Java. Hi vọng bài viết này sẽ giúp ích được nhiều cho các bạn. Đừng ngại ngần để lại comment nếu như bạn thấy chỗ nào đó không hiểu nhé. Chúc các bạn học tốt.
Nguyễn Văn Thương
Đăng bình luận

menu