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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在  String s=new String(“abc”)中有两个对象,我想知道这两个对象在内存中的位置,和这两个对象在内存中的关系

4 个回复

正序浏览
000lazy 发表于 2014-7-14 16:02
字符串创建过程 ,“abc" 首先在字符池中找是不是包含"abc",有就不创建新字符串,没有就在字符池中 ...

哦,原来是这样,非常感谢你的解答
回复 使用道具 举报
String s = new String("abc");  这个是在堆(new)内存中创建了abc,还有在字符串常量池中也创建了abc,所以有2个对象,s是存储的对应的堆内存的地址指向.
---------------------------------------------------------
String s1 = new String("abc");  这里s1和上面的s情况是一样的,但是在下面的s2中,字符串常量池中不会创建abc,因
String S2 = new String("abc"); 为已经存在.所以s2只在堆内存中创建了一个对象 ,所以是不是创建2个对象,要看具体情况
回复 使用道具 举报
创建字符串的原则:
1、当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在字符串池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
2、Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。3、使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。
4、使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。

因此,直接String str="abc"。只在字符串池内有对象;而String str=new String("abc");则不仅在字符串池有对象,在堆上也会创建一个对象。
可参考这篇博文 http://lavasoft.blog.51cto.com/62575/80034/
回复 使用道具 举报
本帖最后由 000lazy 于 2014-7-14 16:04 编辑

        字符串创建过程 ,“abc" 首先在字符池中找是不是包含"abc",有就不创建新字符串,没有就在字符池中创建字符串"abc"。  new String(“abc”)是创建一个对象,=是赋值给str String类型变量,new的对象是保存在堆中,是指向字符池中“abc"对象的引用。   
        
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马