Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Compact Strings trong Java 9 là gì?

Từ Java 9, JVM tối ưu chuỗi với tính năng Compact Strings. Thay vì mảng char[], chuỗi dùng mảng byte[] kết hợp trường coder xác định encoding: Latin-1 (ISO-8859-1) – 1 byte/ký tự, hoặc UTF-16 – 2 byte/ký tự.

Cơ chế

  • Khi tạo String, JVM kiểm tra nội dung.
  • Chỉ chứa ký tự Latin-1 → dùng byte[] 1 byte/char, coder=0.
  • Có ký tự ngoài Latin-1 → dùng byte[] 2 byte/char (UTF-16), coder=1.
  • Quyết định cố định tại thời điểm tạo, không đổi sau đó.

Cấu trúc nội bộ String

// Java 8
public class String {
    private final char[] value;
}

// Java 9+
public class String {
    private final byte[] value;
    private final byte coder; // 0 = LATIN1, 1 = UTF16
    // + hash field (cached hashCode)
}

Cấu hình

  • Mặc định: BẬT.
  • Tắt: -XX:-CompactStrings (lưu tất cả chuỗi dạng UTF-16, không revert về char[]).

Lợi ích

Ví dụ minh họa

jshell> String latin = "Hello World";
jshell> String unicode = "Hello 世界";

/* latin: coder=0, value.length=11 bytes
   unicode: coder=1, value.length=18 bytes (UTF-16) */

Compact Strings là tối ưu hóa "transparent" – không thay đổi API, chỉ cải thiện hiệu năng/bộ nhớ tự động.

Lợi íchGiải thích
Giảm heap memoryChuỗi Latin-1 (phổ biến trong app Anh) giảm 50% bộ nhớ.
GC nhanh hơnÍt object hơn, heap nhỏ hơn → GC ít tốn thời gian hơn.
Cache localityDữ liệu nhỏ hơn → nhiều object hơn trong CPU cache line.
Không unpack/repackKhác với Compressed Strings Java 6, không chuyển đổi giữa byte[]/char[].