常规的角度来说,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 类的部分方法。这里体现了函数式编程的重要特征:"函数式编程对程序中的赋值进行了限制和规范。"