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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄奇耀 中级黑马   /  2012-2-18 08:00  /  2459 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String str = new String("java");这行代码怎么创建了两个对象??

评分

参与人数 1技术分 +1 收起 理由
admin + 1 问这个问题的人真多! 建议避免重复哦...

查看全部评分

9 个回复

倒序浏览
首先你要理解constant   pool,   这是一个特殊的共享区域。
如果你用了String   s   =   new   String("java");   
那么,会有两个String被创建,
一个是你的Class被CLassLoader加载时,你的"xyz"被作为常量读入,在constant   pool里创建了一个共享的"xyz"  ;
然后,当调用到new  String("java")的时候,会在堆内存里创建这个new  String("java");
顺序执行以下代码:
String   s1   =   new   String("xyz");     //创建二个对象  
String   s2   =   new   String("xyz");     //创建一个对象,并且以后每执行一次创建一个对象  
String   s3   =   "xyz";     //创建一个对象  
String   s4   =   "xyz";     //不创建对象,只是创建一个新的引用  

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 1毫秒的价值 于 2012-2-18 08:59 编辑

老问题了:
1.new一下就是在堆内存中开辟了一个空间,创建了一个对象。
2.“java”是一个字符串,并且这个字符串一开始在字符串池中是不存在的,因此新创建了一个“java”字符串对象,并放入池中。
3.new String()这个对象引用了“java”,就是指向了字符串池中“java”的地址。
4.str这个栈内存的变量指向了new String()这个对象。
楼主可以翻一下论坛关于这种问题的帖子,有很多同学对此解释的更加形象、准确。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 确实是老问题了!

查看全部评分

回复 使用道具 举报
首先new出来的就是一个对象,然后“abc”字符串本身也是一个对象
回复 使用道具 举报
String str = new String("java");
"java"本身就是一个字符串,是一个对象;你又用了一个new,又创建了一个对象,你要知道new是用来创建对象的。
回复 使用道具 举报
String str = new String("java");
"java"本身就是一个字符串,是一个对象;你又用了一个new,又创建了一个对象,你要知道new是用来创建对象的。
回复 使用道具 举报
给你写个例子具体理解一下吧
public class StringInternTest {
public static void main(String[] args) {
// 使用char数组来初始化a,避免在a被创建之前字符串池中已经存在了值为"abcd"的对象
String a = new String(new char[] { 'a', 'b', 'c', 'd' });
String b = a.intern();
if (b == a) {
System.out.println("b被加入了字符串池中,没有新建对象");
} else {
System.out.println("b没被加入字符串池中,新建了对象");
}
}
}
请三思代码。方法体改为
String c = "abcd";  // 或者 String c = "abc";
String a = new String(new char[] { 'a', 'b', 'c', 'd' });
b = a.intern();
if (b == c) {
System.out.println("b被加入了字符串池中,没有新建对象");
} else {
System.out.println("b没被加入字符串池中,新建了对象");
}
才能说明问题。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
String str = new String("java");
一个或两个
如果在缓冲中"java"的字符串常量,就创建了一个,没有则创建了两个(一个是"java"的常量,一个str所指向的new String("java")的对象)
回复 使用道具 举报
创建两个对象是正确的,因为在String str = new String("java")中一个对象是被new出来的,另外的一个对象是存储在string类的常量池中的,所以结果应该是创建两个对象,
回复 使用道具 举报
String str="java";这个就是创建一个对象,你在new String();就是两个了::
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马