黑马程序员技术交流社区

标题: 关于对象创建问题 [打印本页]

作者: 黄奇耀    时间: 2012-2-18 08:00
标题: 关于对象创建问题
String str = new String("java");这行代码怎么创建了两个对象??
作者: 彭坤    时间: 2012-2-18 08:56
首先你要理解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";     //不创建对象,只是创建一个新的引用  


作者: 戚雪晖    时间: 2012-2-18 08:58
本帖最后由 1毫秒的价值 于 2012-2-18 08:59 编辑

老问题了:
1.new一下就是在堆内存中开辟了一个空间,创建了一个对象。
2.“java”是一个字符串,并且这个字符串一开始在字符串池中是不存在的,因此新创建了一个“java”字符串对象,并放入池中。
3.new String()这个对象引用了“java”,就是指向了字符串池中“java”的地址。
4.str这个栈内存的变量指向了new String()这个对象。
楼主可以翻一下论坛关于这种问题的帖子,有很多同学对此解释的更加形象、准确。
作者: 陈伟    时间: 2012-2-18 09:01
首先new出来的就是一个对象,然后“abc”字符串本身也是一个对象
作者: 黄锦成    时间: 2012-2-18 09:33
String str = new String("java");
"java"本身就是一个字符串,是一个对象;你又用了一个new,又创建了一个对象,你要知道new是用来创建对象的。
作者: 花开~的季节    时间: 2012-2-18 11:28
String str = new String("java");
"java"本身就是一个字符串,是一个对象;你又用了一个new,又创建了一个对象,你要知道new是用来创建对象的。

作者: 仵先进    时间: 2012-2-19 19:16
给你写个例子具体理解一下吧
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没被加入字符串池中,新建了对象");
}
才能说明问题。
作者: 【专】【属】    时间: 2012-2-20 15:25
String str = new String("java");
一个或两个
如果在缓冲中"java"的字符串常量,就创建了一个,没有则创建了两个(一个是"java"的常量,一个str所指向的new String("java")的对象)
作者: 李会启    时间: 2012-2-21 13:07
创建两个对象是正确的,因为在String str = new String("java")中一个对象是被new出来的,另外的一个对象是存储在string类的常量池中的,所以结果应该是创建两个对象,
作者: 花开~的季节    时间: 2012-2-21 17:48
String str="java";这个就是创建一个对象,你在new String();就是两个了::




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