String 对象可谓再熟悉不过了,与此相关的面试题经常会引出内存性能优化的问题,本篇主要以 new String("123") 创建了几个对象为例记录。
一、你能回答正确吗
String a = "123";
如上定义的为常量;
String b = a +"456";
如上 b 为变量,为啥? 难道常量拼接常量得到的是变量吗?
不是,常量拼接常量得到的依旧是常量。
但是此时将 a 作为引用,a 已经不再是常量了,是变量了,所以得到的 b 自然就是变量。
String b = "123" + "456";
此时 b 为常量。
如果给 a 加上修饰符 final ,那么 a 就是个常量,那么 b 就为常量了。
二、String定义常量和变量的区别
我们再来通过两种写法分析:
String a = "123";
String b = new String("123");
如上第1行,定义了一个常量 a ,第2行,通过关键字 new 的形式,创建了一个变量 b 。
我们结合之前学过的 JVm 再深入一些,第1行在常量池开辟了一块空间,存放字符串 123,通过 a 对象指向这个常量对象。第2行由于使用了 new 关键字,所以会在堆空间中开辟一块内存区域,在其中