对java字符串是不可变的特性深度理解

我们都知道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指向的那个位置

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值