String s = new String("xyz");创建了几个对象

none201023 2010-08-26 03:08:49
String s = new String("xyz");创建了几个对象?
下面说法正确吗?

创建String 有两个方法
1,String a = "xyz"
2,String a = new String("xyz")

为了提高效率,JVM 有个 String constant pool 的东东,先命名为scp
当用第一种方法创建 String  时,首先在这个scp里找,
看有没有现成的"xyz",如果有,就直接把 a  指向它,如果
没有,就在scp 里面创建一个,然后把 a 指向它。。。。
当用第二种方法创建String 时,用正常的方法在 heap 中创建一个
"xyz" .然后再创建一个 "xyz" 放到 scp 里,以备使用。。。。
scp 与 heap 是两个不同的内存区域)
...全文
466 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Crystal_Knight 2010-08-26
  • 打赏
  • 举报
回复
1 个
2 个
yx_kelsey 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zx343554806 的回复:]

引用 17 楼 none201023 的回复:

我的理解:

变量名和其引用存储在栈中。
[/Quote]

我觉的也是这样子的,对象实例才放到堆中
stendson 2010-08-26
  • 打赏
  • 举报
回复
首先:java存储区
1.寄存器 (不能直接控制)2。堆栈 (存放临时变量和对象引用,函数参数,基本数据类型)3。堆(heap区,对象) 4。静态存储区(静态变量) 5。常量存储区 6。非静态存储区(流持久化和序列化对象,存活于程序外,如磁盘等)
其次:程序加载时String s =“abc”会先在常量池中查找时否存在字符串,若有将s指向他,若无在常量池中创建 并s指向它
String s = new String("abc")在会先在常量池中查找是否存在"abc“字符串,如果存在,则直接在heap区创建其引用,否则会先在常量池中创建字符串"abc",再在heap区上创建“abc”的引用
再次:对于 String s = new String("abc") 程序会再在堆栈上创建 s,并将s指向heap区中的引用,而heap区指向常量池。
对于常量池,不同jvm分配不同的大小 以下可以测试jdk1.6
public class Test
{
public static void main(String[] args){
Integer i1=1;
Integer i2=1;
System.out.println(i1==i2);
Integer i3=128;
Integer i4=128;
System.out.println(i3==i4);

}
}
PandaIT 2010-08-26
  • 打赏
  • 举报
回复
蛋痛的问题!此类贴子又来了!
  • 打赏
  • 举报
回复
我去,,月经贴 又来了。。。。
干点实事把
我在肖申克 2010-08-26
  • 打赏
  • 举报
回复
1,String a = "xyz" 一个
2,String a = new String("xyz") 两个
evangelionxb 2010-08-26
  • 打赏
  • 举报
回复
String str1 = new String("xyz");
String str2 = new String("xyz");
String s1 = "xyz";
String s2 = "xyz";

System.out.println(s1==s2); 返回true
System.out.println(str1==str2); 返回false


从内存上来说
后者 栈空间分配内存给s
栈空间分配内存给字符串"xyz"
s指向"xyz"

前者是 栈空间分配内存给str
堆new了一个对象 值为空
对象赋值"xyz"
s指向string对象

不知道我理解的对不?
ljm011101361 2010-08-26
  • 打赏
  • 举报
回复
学习学习
zx343554806 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 none201023 的回复:]
这个 a变量名 也就是引用名 摆哪里?
[/Quote]

我的理解:

变量名和其引用存储在栈中。
koj5201314 2010-08-26
  • 打赏
  • 举报
回复
好熟悉的笔试题 2个~~~
none201023 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zx343554806 的回复:]

我的理解:

String a = new String("xyz")
类加载时,"xyz"就被读入并在常量池创建了,
然后调用到new String("xyz")的时候,就在堆上创建new String("xyz")

所以是2个对象。。

-----------------------------------------------------------------

……
[/Quote]

这个 a变量名 也就是引用名 摆哪里?
WayneMarkRooney 2010-08-26
  • 打赏
  • 举报
回复
两个,解释同意14楼的。
god_wot 2010-08-26
  • 打赏
  • 举报
回复
是两个对象。可以参考一下Java API 再结合你理解的常量池.
String(String original)
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;
换句话说,新创建的字符串是该参数字符串的副本。
zx343554806 2010-08-26
  • 打赏
  • 举报
回复
我的理解:

String a = new String("xyz")
类加载时,"xyz"就被读入并在常量池创建了,
然后调用到new String("xyz")的时候,就在堆上创建new String("xyz")

所以是2个对象。。

-----------------------------------------------------------------

其实常量池是属于类的内容,所以在加载的时候也是创建在堆上的,
所以其实常量池的内容应该也是存在于堆上的。

简单的说,堆上用来存放 所有new出来的对象。
栈则多是存放存放 基本类型的变量数据和对象的引用
goldyellow34 2010-08-26
  • 打赏
  • 举报
回复
两个啊
blank_jia1985 2010-08-26
  • 打赏
  • 举报
回复
常量池1个,堆1个。
qianyecq 2010-08-26
  • 打赏
  • 举报
回复
进来学习。
zamtion 2010-08-26
  • 打赏
  • 举报
回复
围观。。。
none201023 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 leojing888 的回复:]

引用 6 楼 huozhicheng 的回复:
当然是两个

两个啊!
[/Quote]
麻烦大家能把自己的想法 或 理解 讲出来吗 谢谢。
leojing888 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 huozhicheng 的回复:]
当然是两个
[/Quote]
两个啊!
加载更多回复(7)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧