String 不可变的原因
不可变: 类的实例创建后,其内容状态不可变.
String str1 = "abc";
str1 = "bcd";
只是字符串str1 指向了另一个内容. 原来的字符串并不会改变.
在底层代码可以看到
value数组被final修饰.但这并不正确.
public static void test(){
final char[] name = {'a','b','c','v'};
name[0] = 'e';
System.out.println(name);
}
final 只保证了name存放的地址不会改变. 但里面的值仍能变.
final修饰变量的含义
基本数据类型:
一旦初始化,便不能改变其值
引用数据类型:
一旦初始化,便不能改变其引用,也就是不能指向一个新的对象,但仍可以修改引用指向的对象内容
为什么不可变:
- value使用final修饰 (保证value一旦被初始化,变不能改变其引用)
- 没有暴露成员变量 (均为private,没有提供方法将字段暴露出来,想要修改只能通过String提供的方法)
- 内部的方法没有去改动value
- 类用final修饰,不可继承.
不可变的好处
- 安全
- 节省空间 —字符串常量池
- 线程安全
- 性能
https://mp.weixin.qq.com/s/6RqNTSHg_2_mfdI3jTIAoA