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类构造函数创建对象时,和创建其他类型的对象一样,都是在堆内,不存在什么字符串缓存区中找相同的字符串去复用;因此创建出来的对象的引用是不可能相同的;
结果: