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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String s=new String(“xyz”);创建了几个字符串对象?

12 个回复

倒序浏览
本帖最后由 cat73 于 2016-8-9 21:26 编辑

创建了一个哟~
相关证明可以看这里:http://bbs.itheima.com/forum.php ... 580&pid=2642261
回复 使用道具 举报
这个很简单啊  你看咯
假设我们定义一个
String s2 ="xyz";
String s1=new String(“xyz”);
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true
new String 是一个对象
"xyz"又是一个对象.
==比较的是值.
equals比较的是内容.
所以new String("xyz");地址值是不一样的
个人理解{:2_30:}勿喷

点评

两个对象不一致并不代表创建了两个对象哟  发表于 2016-8-9 23:11
回复 使用道具 举报 1 0
如果常量池中已经建立“xyz”只会创建一个对象 new String(“xyz”)
如果常量池中没有这个“xyz”,就会创建一个“xyz”,然后在创建一个new String(“xyz”)

点评

你这个理解有误哟,常量池中不会出现没有的情况,如果真的没有,JVM 会直接报错然后崩溃。  发表于 2016-8-9 21:33
回复 使用道具 举报
两个啊,一个是常量池里面的"xyz",另一个是堆内存里面的对象s

点评

一共有两个对象,但并不是创建了两个对象,这句代码仅创建了一个对象。  发表于 2016-8-9 21:29
回复 使用道具 举报
视频里说的是两个,常量池一个,堆内存一个副地址。
回复 使用道具 举报
lvyanxin 发表于 2016-8-9 21:02
如果常量池中已经建立“xyz”只会创建一个对象 new String(“xyz”)
如果常量池中没有这个“xyz”,就会 ...

那这个呢    String a = "abc";    是不是没创建对象?     
回复 使用道具 举报
cat73 黑马帝 2016-8-9 23:13:32
8#
lvyanxin 发表于 2016-8-9 21:57
那这个呢    String a = "abc";    是不是没创建对象?

是的,没有创建新对象。
这个对象是直接从常量池里 ldc 出来的。
ldc 不会创建对象,ldc 在遇到常量池中没有要找的对象的情况下,会直接抛错。
回复 使用道具 举报
两个把,!!
回复 使用道具 举报

为什么呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马