String真的是不可变的吗?【详细介解】

今天爱分享给大家带来String真的是不可变的吗?【详细介解】,希望能够帮助到大家。
我觉得如果别人问这个问题的话,回答不可变就可以了。 下面只是给大家看两个有代表性的例子:

1) String不可变但不代表引用不可以变

String str = "Hello";
str = str + " World";
System.out.println("str=" + str);



结果:



str=Hello World
1
解析:

解析:

实际上,原来String的内容是不变的,只是str由原来指向”Hello”的内存地址转为指向”Hello World”的内存地址而已,也就是说多开辟了一块内存区域给”Hello World”字符串。

2) 通过反射是可以修改所谓的“不可变”对象


// 创建字符串"Hello World", 并赋给引用s
String s = "Hello World";

System.out.println("s = " + s); // Hello World

// 获取String类中的value字段
Field valueFieldOfString = String.class.getDeclaredField("value");

// 改变value属性的访问权限
valueFieldOfString.setAccessible(true);

// 获取s对象上的value属性的值
char[] value = (char[]) valueFieldOfString.get(s);

// 改变value所引用的数组中的第5个字符
value[5] = '_';

System.out.println("s = " + s); // Hello_World


结果:


s = Hello World
s = Hello_World


解析:

用反射可以访问私有成员, 然后反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。但是一般我们不会这么做,这里只是简单提一下有这个东西。

人已赞赏
Java

String有哪些特性?【面试题详解】

2020-11-30 17:07:48

Java

是否可以继承 String 类?【面试题详解】

2020-11-30 17:11:40

'); })();