常規的角度來說,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 類的部分方法。這裡體現了函數語言程式設計的重要特徵:"函數語言程式設計對程式中的賦值進行了限制和規範。"