Bỏ qua để đến nội dung

Kiểu dữ liệu chuỗi (String)

1. String là một class, không phải kiểu nguyên thủy

Phần tiêu đề “1. String là một class, không phải kiểu nguyên thủy”

Khác với int, double, boolean,… (kiểu nguyên thủy - primitive type), String trong Java là một class - mọi biến String thực chất là một tham chiếu (reference) đến một đối tượng String:

String greeting = "Xin chào, Java!";
System.out.println(greeting);

Một đối tượng String không thể thay đổi nội dung sau khi tạo. Mọi phương thức trông như “sửa đổi” chuỗi (concat, toUpperCase, replace,…) thực ra tạo ra một đối tượng String mới:

String name = "an";
String upper = name.toUpperCase(); // tạo MỘT ĐỐI TƯỢNG MỚI, không sửa name
System.out.println(name); // an - không đổi!
System.out.println(upper); // AN - chuỗi mới
String a = "hello"; // string literal - Java tái sử dụng từ "string pool"
String b = "hello"; // trỏ đến CÙNG một đối tượng trong pool với a
String c = new String("hello"); // luôn tạo một đối tượng MỚI trên heap, không dùng pool

Với string literal, Java lưu các chuỗi trong một vùng nhớ đặc biệt gọi là string pool để tái sử dụng - hai literal giống hệt nhau sẽ trỏ đến cùng một đối tượng. new String(...) thì luôn tạo đối tượng mới, kể cả nội dung giống hệt literal đã có. Chi tiết về hệ quả khi so sánh bằng == được nói ở trang “So sánh chuỗi với equals và toán tử ==” trong mục What the Java!.

String first = "Xin";
String second = "chào";
String full = first + " " + second + "!"; // "Xin chào!"
int year = 2026;
String message = "Năm nay là " + year; // nối số vào chuỗi tự động chuyển sang String
String poem = """
Đường vô xứ Huế quanh quanh
Non xanh nước biếc như tranh họa đồ""";

(Xem chi tiết ở trang “Định dạng xuất dữ liệu”.)

  • String là một class, biến String là tham chiếu đến đối tượng String
  • String bất biến - mọi thao tác “sửa đổi” đều trả về một chuỗi mới, chuỗi gốc không đổi
  • String literal được tái sử dụng qua string pool; new String(...) luôn tạo đối tượng mới
  • Các phương thức xử lý chuỗi phổ biến được nói chi tiết ở trang tiếp theo