Mutable vs Immutable, String vs String Buffer vs String Builder

 

String

  • Khái niệm: String trong Java đại diện cho chuỗi ký tự và là không thay đổi (immutable). Có hai cách để khởi tạo String:

    String str1 = "ABC"; // Tạo từ literal String str2 = new String("ABC"); // Tạo từ đối tượng
  • Bản chất immutable: String không thay đổi sau khi được tạo. Điều này đảm bảo an toàn khi sử dụng trong môi trường đa luồng và cho phép chia sẻ không bị xáo trộn dữ liệu.
  • Tiết kiệm bộ nhớ: JVM quản lý một String pool để tối ưu hóa việc sử dụng bộ nhớ bằng cách lưu trữ các chuỗi giống nhau chỉ một lần.
  • Phép cộng (+): Toán tử + cho phép nối chuỗi String, nội bộ sử dụng StringBuffer để thực hiện hành động này.
  • So sánh và hashcode: String có các phương thức equals()hashCode() để so sánh giá trị chuỗi. equals() phân biệt hoa thường, còn equalsIgnoreCase() không phân biệt.
  • Mã hóa UTF-16: Dữ liệu ký tự của String được lưu trữ và xử lý theo mã hóa UTF-16.

StringBuffer

  • Mutable và thread-safe: StringBuffer là một lớp có khả năng thay đổi (mutable) và đồng bộ hóa (thread-safe). Các phương thức của nó được đồng bộ hóa để đảm bảo an toàn trong môi trường đa luồng.
  • Sử dụng và hiệu suất: Dùng StringBuffer khi cần thực hiện các thao tác chuỗi trong môi trường đa luồng. Tuy nhiên, vì phải đồng bộ hóa, nên có thể làm giảm hiệu suất so với StringBuilder.

StringBuilder

  • Mutable nhưng không đồng bộ: StringBuilder tương tự StringBuffer về tính mutable, nhưng không đồng bộ hóa. Điều này làm cho StringBuilder có hiệu suất cao hơn StringBuffer trong các môi trường không đa luồng.
  • Hiệu suất: Với môi trường đơn luồng hoặc không cần bảo đảm đồng bộ, sử dụng StringBuilder để tối ưu hiệu suất.

Tóm lại

  • Lựa chọn sử dụng:
    • Sử dụng String khi bạn cần một chuỗi không thay đổi.
    • Sử dụng StringBuffer khi bạn cần đảm bảo đồng bộ và an toàn trong môi trường đa luồng.
    • Sử dụng StringBuilder khi bạn không cần đảm bảo đồng bộ, như trong môi trường đơn luồng.

Đây là sự khác biệt chính giữa String, StringBuffer, và StringBuilder trong Java, mỗi loại có ứng dụng và điểm mạnh riêng.