黑马程序员技术交流社区
标题:
关于对象创建问题
[打印本页]
作者:
黄奇耀
时间:
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