我们都知道java中有堆、栈、方法区等
而字符串存储在堆内存得常量池中(最新版java中)
例如:String a = “ssss”;
a就在栈内存 叫做引用
ssss则存在堆内存的常量池中
而这个=号则代表地址的指向
附上一张图:
为什么不可变呢? 因为字符串使用的是数组数据结构而数组大家都知道数组的地址是需要连续的 然而字符串没有固定的存储长度所以必须一开始指定假设
ssss占用了四个内存
如果它是可变的那么我想多一个内存直接在后面加不就得了问题的关键是在内存中不只有一个线程在运行
比如黑色的地方很可能就会被其他线程的程序占用内存就导致无法添加删除一块对于计算机而言判断地址之类的也是开销所以字符串不是可变的
看个例子:
String a = "111";
a = a.substring(0,2);
内存是什么样子的呢
一开始是实线指向之后是虚线指向,”111“这一块地址是不会改变的如果重新给a换值,那么他将申请一个新的内存并将a中的地址的值换成“11”但是原来“111”本身的地址是不会发生改变。
这就涉及到了java的一个特性在java中都是值传递
如果有一个String b = “111”;
那么是不是也要申请一个内存呢其实是不用的,这也是不可变字符串的一个优点编译器可以让字符串共享 也就是说b指向a指向的那个位置