黑马程序员技术交流社区

标题: String str = new String("abc"); String str = "abc"; [打印本页]

作者: 王舜民    时间: 2012-9-10 14:09
标题: String str = new String("abc"); String str = "abc";
本帖最后由 王舜民 于 2012-9-10 15:43 编辑

我这么理解对不?
String str = new String("abc");  String str = "abc";创建几个对象的问题。之前问过,这是我自己理解的图,看看有问题没?
主要看下我画的图

String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。

比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。

String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。
作者: 武庆东    时间: 2012-9-10 14:38
正确,没有错误!
作者: 黑马王建伟    时间: 2012-9-10 14:49
恩,是这样的,楼主只要记住 只要new就是创建一个新的对象,还有常量池的概念,这样的题就没问题了
作者: 王舜民    时间: 2012-9-10 14:51
我要给别人解释呢,别把别人教错了。。。
作者: 杨习平    时间: 2012-9-10 15:07
本帖最后由 杨习平 于 2012-9-10 15:09 编辑

String str = "abc";
第一个在字符串常量区中定义了一个区域,简单的说创建了一个对象,一个引用。

String str = new String("abc");
第二个在字符常量区里定义了一个区域,在堆里创建了一个区域,在栈里创建了一个引用
简单的举例   如果用    ‘==’   来将这两个对象做比较,得到的结果是false
当然,equal比较忽略引用,只比较内容,会得到true。
------------------------------------------------------------------------------------------
你的推理过程很清晰,自己能理解到这个程度就不错了,我自己都惭愧啊,
向你学习。
作者: 王舜民    时间: 2012-9-10 15:26
杨习平 发表于 2012-9-10 15:07
String str = "abc";
第一个在字符串常量区中定义了一个区域,简单的说创建了一个对象,一个引用。

我的图才是推理。
。。。。。
作者: 孙沛    时间: 2012-9-10 15:29
哈哈哈,没错
作者: 李祖庆    时间: 2012-9-10 15:31
你阐述的对,你可以看下我的一篇帖子,也有关于这的
作者: 王舜民    时间: 2012-9-10 15:42
谢谢各位,我关帖子了
作者: 夏天    时间: 2012-9-10 21:25
........................
作者: 王金科    时间: 2012-9-11 00:09
拿分啦!!!
作者: 徐传任    时间: 2012-9-11 10:35
挺好.......




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2