ตั้งแต่ Java 9 JVM เพิ่มประสิทธิภาพสตริงด้วยฟีเจอร์ใหม่ชื่อ Compact Strings แทนที่จะใช้ char[] array สตริงสามารถแทนได้ด้วย byte[] array ใช้ UTF-16 หรือ Latin-1 ผลิต 1 หรือ 2 ไบต์ต่อตัวอักษร หาก JVM ตรวจพบว่าสตริงมีเฉพาะตัวอักษร ISO-8859-1/Latin-1 จะใช้ 1 ไบต์ต่อตัวอักษรภายใน
การแทนสตริงด้วย compact string หรือไม่ จะถูกตัดสินใจตอนสร้างสตริง ฟีเจอร์นี้ เปิดใช้งานโดยค่าเริ่มต้น ปิดได้ด้วย -XX:-CompactStrings ไม่ย้อนกลับไปใช้ char[] implementation และเก็บทุกสตริงเป็น UTF-16
เปรียบเทียบโครงสร้าง String
Java 8
public class String {
private final char[] value; // เก็บตัวอักษรในสตริง
// ...
}
Java 9 (Compact Strings)
public class String {
private final byte[] value; // เก็บตัวอักษรในสตริง
private final byte coder; // flag: 1 ไบต์ต่อตัวอักษร หรือ 2 ไบต์ต่อตัวอักษร
// ...
}
ประโยชน์ของ Compact Strings
- ลดหน่วยความจำ: สตริง ASCII/Latin-1 ใช้พื้นที่ลดลง 50%
- ประสิทธิภาพดีขึ้น: Cache friendly มากขึ้น เนื่องจากขนาดเล็กลง
- ไม่ต้อง unpack/repack: ต่างจาก Compressed Strings เดิม
- รองรับ UTF-16: ยังคงรองรับ Unicode เต็มรูปแบบได้
การตรวจสอบ
สามารถดู coder ได้ผ่าน reflection หรือการ debug:
- coder = 0 → LATIN1 (1 byte/char)
- coder = 1 → UTF16 (2 bytes/char)