String a = “abc”和String a = new String(“abc”)比较

1. String a = “abc” 创建了0个或1个对象。

首先在栈中定义一个引用变量a,检查字符串常量池中是否存在”abc”,存在则直接指向”abc”的地址(指向的是字符串常量池中的地址),不存在则先在常量池中创建”abc”再指向其地址。

常量池中不存在"abc"字符串:
(1)在栈中创建3个char型字符'a','b','c'
(2)在堆中new一个String对象,它的值是刚才在栈中创建的三个char型值组成的数组{'a','b','c'}
(3)把这个String对象放进字符串常量池中,
(4)将a指向这个对象在字符串常量池中的地址。

String a = "abc";
等价于
char data[] = {'a', 'b', 'c'};
String a = new String(data);

2. String a = new String(“abc”)创建了1个或者两个对象

首先在栈中定义了一个引用变量a,然后在堆中new一个String对象,a指向这个对象,然后new出来的String对象再指向常量池中的abc。

3. 比较

String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
System.out.println(a == b);
System.out.println(a == c);
System.out.println(c == d);

结果:true、false、false

new String(“abc”) 无论字符串常量池中是否存在“abc”,都会在堆中生成一个新的对象,c和d的引用指向各自堆的地址,堆引用才指向常量池。所以a、c、d三者不相等。

相关说明:

1、终身VIP会员无限制任意下载,免积分。即前往开通>>

2、下载积分可通过日常 签到 以及 积分兑换 等途径获得!

3、本站资源无解压密码.

4、本站资源大多存储在云盘,如出现链接失效请评论反馈。

5、本站提供的免费源码、模板、软件工具等其他资源,均不包含技术服务,请大家谅解!资源仅供参考学习只用,请勿用于任何商业用途,请支持正版。

6、源码、模板等资源会随着技术、环境的升级而存在部分问题,还请慎重选择。

本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
内容来源:架构师必备
南方小强 » String a = “abc”和String a = new String(“abc”)比较

发表评论