App下載

Java中String為什么是不可變的?

猿友 2021-04-08 18:06:58 瀏覽數(shù) (2903)
反饋

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)容。


0 人點(diǎn)贊