String不可变以及字符串缓存池,new String 与双引号赋值的区别

1. 了解字符串String

1.1 String实质

首先字符串是引用变量,它与数组不同,数组创建后是可以改变的,但是字符串一旦创建,它的值就不能被修改。

在执行赋值操作时,并不是将字符串内容复制过去,而是把指向同一个对象的引用赋值过去,例如这里的 a 把指向 “Hello world”的引用赋值给 b 。为什么把 a 改变为“Hello Java” b还是Hello world呢?因为看似是在改变 a 原来字符串的值,实际上是把“Hello Java”的引用给了a。接着看String的内存管理能更明白这个操作

1.2 String的内存管理

当我们创建一个字符串的时候,Java会在堆内存中分配一块空间来存储它。在用 = “ ”直接赋值的时候,Java底层会检查堆内存的字符串缓存池中是否存在相同的字符串,如果存在就复用这个字符串对象,把相同的引用赋值过去,如果不存在,那么就在堆创建一个;

通过复用字符串对象,可以节省内存空间,提升程序的性能。

2. new String()  和 直接使用双引号 “  ” 赋值的区别 

1. 双引号

Java会首先检查字符串缓存池中是否存在相同的字符串,如果存在就复用这个字符串对象,把相同的引用赋值过去,如果不存在,那么就在堆创建一个;

结果:

  

2.new String()

在使用String类构造函数创建对象时,和创建其他类型的对象一样,都是在堆内,不存在什么字符串缓存区中找相同的字符串去复用;因此创建出来的对象的引用是不可能相同的; 

结果:

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值