java-String类型构造函数不解

zhao_xinhu 2018-09-05 11:02:52
String a = "abc";
String b = new String(a);
我们知道字符串有两种声明方式,1、字面量;2、new的方式如上。
字面量声明方式只是在常量池中声明了一个不可改变的abc字符串,等new String(a)的时候我们直接看源码:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
我的问题是:original.value和original.hash是哪里来的?按理来说不应该只有通过new的时候对象才会初始化这些属性值吗,
声明字面量a的时候并没有new,传进去如何获取这些属性值呢?
...全文
564 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
stacksoverflow 2018-09-06
  • 打赏
  • 举报
回复
引用 6 楼 zhao_xinhu 的回复:
[quote=引用 1 楼 stacksoverflow 的回复:]
String a = "abc";
首先检查常量池中是否有对"abc"的引用,如果没有,则在堆中生成一个String对象,并返回这个对象。
这就是original
详见这个帖子13楼的回答:
https://bbs.csdn.net/topics/392442266

你这里不是说先检查常量池里有引用没,此时常量池中肯定没有引用,所以堆里生成一个,常量池中一个,不是刚好两个吗?[/quote]
堆里的是对象,常量池里不存对象,存一个该字符串的唯一标示(比如hashCode),和指向该对象的引用。
mainthings 2018-09-06
  • 打赏
  • 举报
回复
zhao_xinhu 2018-09-06
  • 打赏
  • 举报
回复
引用 4 楼 ILoveZhc 的回复:
https://blog.csdn.net/purple25/article/details/52098454这篇文章很清晰

嗯嗯,我去看了你说的这篇文章。
他的意思是String b = new String("abc")时,堆中会new String对象,常量池中会有一个对象"abc",堆中的new String指向常量池中"abc";
而String a = "aa"代表直接由变量a指向常量池中的字符,省了new,也就是堆中没有对象,如果是这样的话,又回到我最开始的问题了。
original.value和original.hash是哪里来的?
不知道你对这个是怎么理解的?
zhao_xinhu 2018-09-06
  • 打赏
  • 举报
回复
引用 1 楼 stacksoverflow 的回复:
String a = "abc";
首先检查常量池中是否有对"abc"的引用,如果没有,则在堆中生成一个String对象,并返回这个对象。
这就是original
详见这个帖子13楼的回答:
https://bbs.csdn.net/topics/392442266

你这里不是说先检查常量池里有引用没,此时常量池中肯定没有引用,所以堆里生成一个,常量池中一个,不是刚好两个吗?
stacksoverflow 2018-09-05
  • 打赏
  • 举报
回复
String a = "abc";
首先检查常量池中是否有对"abc"的引用,如果没有,则在堆中生成一个String对象,并返回这个对象。
这就是original
详见这个帖子13楼的回答:
https://bbs.csdn.net/topics/392442266
Gin369 2018-09-05
  • 打赏
  • 举报
回复
1不创建对象的情况下,直接去常量池中的引用
2是在new一个对象后也会在常量池中指向引用,如果有就直接指向他,如果没有则会在堆中new一个对象指向常量池中
傅九爷 2018-09-05
  • 打赏
  • 举报
回复
https://blog.csdn.net/purple25/article/details/52098454这篇文章很清晰
stacksoverflow 2018-09-05
  • 打赏
  • 举报
回复
引用 2 楼 zhao_xinhu 的回复:
String a = new String("abc");这个会产生两个对象,一个是常量池中的对象,另一个是堆中的String对象。
String a = "abc";也是这样的吗?

String a = new String("abc");产生两个对象
String a = "abc";产生一个对象
zhao_xinhu 2018-09-05
  • 打赏
  • 举报
回复
String a = new String("abc");这个会产生两个对象,一个是常量池中的对象,另一个是堆中的String对象。
String a = "abc";也是这样的吗?

50,631

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧