常规的角度来说,Java 里的 String 对象确实是不可修改的。对于理由,常规回答可能是:因为 final 关键字限制了对对象的修改。不对对于这个答复我觉得既不是完全准确,也没有回答到核心点。

如下这段代码就可以实现对 String 对象的修改。

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    var s = "sc";
    var aClass = s.getClass();
    var value = aClass.getDeclaredField("value");
    value.setAccessible(true);
    value.set(s, "cs".getBytes());
    System.err.println(s);
}

只是针对 final 的限制来回答是否可以修改,就留于表面了。

我对于这个问题的回答是:从常规的角度来说,String 对象确实不可修改。其原因是 String 类并没暴露出其底层的数据结构,所以我们无法直接修改数据来实现修改对象的效果。我们调用 String 对象的方法时,该类的实现者控制了每次都返回新的对象。

实现者采用了函数式编程的思想实现了 String 类的部分方法。这里体现了函数式编程的重要特征:"函数式编程对程序中的赋值进行了限制和规范。"