Java 中 的 string 為什么不可變?相信大家都有這個(gè)疑問,本篇文章告訴你答案。
String 為什么不可變
String 類利用了 final 修飾的 char 類型數(shù)組去存儲(chǔ)字符,源碼如下:
/** The value is used for character storage. */
private final char value[];
String 為什么不可變
String 類利用了 final 修飾的 char 類型數(shù)組去存儲(chǔ)字符,源碼如下:
/** The value is used for character storage. */
private final char value[];
String 真不可變嗎
1、String 不可變但不代表引用不可變
String str = "Hello";
str = str + " World";
System.out.println("str=" + str);xi
效果:
str=Hello World
解析:String 內(nèi)容不可變,因?yàn)?str 由原來指向 "Hello" 的內(nèi)存地址轉(zhuǎn)變指向 "Hello World" 的內(nèi)存地址,所以是多開辟了內(nèi)存區(qū)域給 "Hello World "字符串。
2、通過反射可修改不可變對象
// 創(chuàng)建字符串"Hello World", 并賦給引用s
String s = "Hello World";
System.out.println("s = " + s); // Hello World
// 獲取String類中的value字段
Field valueFieldOfString = String.class.getDeclaredField("value");
// 改變value屬性的訪問權(quán)限
valueFieldOfString.setAccessible(true);
// 獲取s對象上的value屬性的值
char[] value = (char[]) valueFieldOfString.get(s);
// 改變value所引用的數(shù)組中的第5個(gè)字符
value[5] = '_';
System.out.println("s = " + s); // Hello_World
效果:
s = Hello World
s = Hello_World
解析:
用反射訪問私有成員,再反射出對象的 value 屬性,再改變 value 引用改變數(shù)組結(jié)構(gòu)。
以上就是小編為您帶來的關(guān)于 Java中String為什么是不可變的? 的全部內(nèi)容。