本文基于 String 源码进行剖析,涉及到字符编码的知识参考自 Unicode Tutorials - Herong’s Tutorial Examples,英文资料讲解的非常详细,建议大家都读一下。
String 真的是 Immutable 的吗
Java 中的 Unicode 字符串会按照 Latin1(所有的字符都小于 0xFF 时)或者 UTF16 的编码格式保存在 String 中,保存为 byte 数组:
private final byte[] value;
通常所说的 Immutable 都是指 final bytes 在 String 初始化后就不会修改,所有字符串的相关操作都是不会修改原数组而是创建新的副本。
但是数组元素理论上是可以修改的,比如下面通过反射的方式,将字符串常量 abc 修改为 Abc:
public static void main(String[] args) {
setFirstValueToA("abc");
String replaced = new String("abc");
System.out.println(replaced); // Abc
}
private static void setFirstValueToA(String str) {
Class<String> stringClass = String.class;
try {
Field value = stringClass.getDeclaredField(