A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘沙 中级黑马   /  2014-8-3 11:21  /  1833 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

* String str="abc";
* String str1=new String("abc");
* 这两句是一回事。//这里的一回事怎么理解?  这里有点理解不了 忘大神们指点
* 区别是:第一句只有一个对象 第二句涉及到两个对象

我这样理解可不可以:第一句的abc字符串在 字符串常量池中  第二句的字符串在堆中 在常量池中的和在堆中的长得一样 都是abc常量

7 个回复

倒序浏览
第二句中局部变量str1存储在栈内存中,new对象存在堆内存中,只是通过地址的传递赋值,所以是涉及到两个对象。第一句就是str直接赋值就这一个对象
回复 使用道具 举报
第一句的abc字符串在字符串常量池中,第二句的字符串也是在常量池中,new String这个对象在堆中,指向常量池中的abc

点评

貌似这个靠谱  发表于 2014-8-3 19:19
回复 使用道具 举报 1 0
二三楼正解。。
回复 使用道具 举报
暗影 发表于 2014-8-3 13:34
第一句的abc字符串在字符串常量池中,第二句的字符串也是在常量池中,new String这个对象在堆中,指向常量 ...

二楼正解
回复 使用道具 举报
第一句的abc字符串在字符串常量池中 创建了一个对象,第二句的字符串也是在常量池中,new String这个对象在堆中,指向常量池中的abc  创建了两个对象

回复 使用道具 举报
可以这样理解:
String s = "abc"是创建一个字符串对象,首先JVM在字符串常量池中检测是否已经存在了该字符串。如果存在,那么直接返回字符串常量池中该字符串的内存地址。如果不存在,那么就需要在字符串常量池中创建该字符串的对象,然后返回该字符串对象的内存地址。

String s1= new String("abc")方式创建字符串的时候,那么jvm首先也会在字符串常量池中检测是否已经存在了"abc"字符串,如果不存在,那么直接在字符串常量池中创建该对象,而且还会去到堆内存中创建该字符串对象,把字符串常量池中字符串对象的内容拷贝过去,并且把堆内存中字符串对象内存地址返回。如果字符串常量池中已经存在了指定的字符串,那么不会在字符串常量池中再创建,但是也去到堆内存中创建一个字符串对象,并且把字符串常量池中的字符串内容拷贝过去。

基础视频里有的,你好好理解一下,主要还是这个过程你要明白。假如我们打印(s==s1)得出的是false,而(s.equals(s1))是true的,它们的地址值是一样的,只是指向的地址不一样。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马