黑马程序员技术交流社区

标题: 关于String的面试题 疑惑 [打印本页]

作者: 尤圣回    时间: 2012-9-18 10:51
标题: 关于String的面试题 疑惑
String s=new String("xzy);创建了几个对象
这个答案是2 有些说是1或2 我知道 在特殊情况下是1或2  那真正面试的时候应该说什么答案呢
作者: 李宁    时间: 2012-9-18 10:58
在堆内存中创建了个对象,然后看线程池是否已经存在这个对象了,如果存在就不再创建了,如果不存在就创建,所以可能是一个也可能是2个
你就把所有情况说出来就好啦
作者: 李宁    时间: 2012-9-18 10:59
在堆内存中创建了个对象,然后看线程池是否已经存在这个对象了,如果存在就不再创建了,如果不存在就创建,所以可能是一个也可能是2个
你就把所有情况说出来就好啦
作者: 严海荣    时间: 2012-9-18 11:28
本帖最后由 严海荣 于 2012-9-18 11:37 编辑

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

所以是2个对象。。

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

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

简单的说,堆上用来存放 所有new出来的对象。
栈则多是存放存放 基本类型的变量数据和对象的引用。




作者: 霍永刚    时间: 2012-9-18 12:22
2个对象。
数据类型分为两类,值类型和引用类型。内存分为栈空间和堆空间。
栈空间存放值类型数据和堆空间的引用地址,堆空间则存放引用类型的数据。
string 型是特殊的引用类型,所以这里创建了一个string型的对象,s是指针,在名为s的栈空间中存放了真正存放“xzy”的堆空间地址。
作者: 吴通    时间: 2012-9-18 13:30
String池中:
(1)
String s1="abc";
String s2="abc";
会检查String池中有没有"abc"对象,如果有则不建立新对象,只是返回引用
所以s1==s2
(2)
String s=new String("abc");
不管缓冲区有没有,都会创建对象
这种情况下会建立两个对象,一个是"abc",另外一个是String s
作者: 汪小照    时间: 2012-9-18 13:48
在真正的面试的时候回答是两个对象。
原因如下:
Java的内存分配有三种,
1、数据存储区:可以存放字符串等数据
2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,
这个变量的内存会被自动释放。
3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,
对象创建时会在堆中为其分配内存。
String s=new String("xzy");这条语句一执行,则"xyz"字符串对象存储于数据区
然后在new的时候会创建一块内存空间在堆内存中,这块内存空间中有一个引用地址,指向了字符串对象。
而变量s是分配在栈内存中,指向了堆内存的那块空间。
图如下所示:

1.jpg (22.34 KB, 下载次数: 13)

1.jpg

作者: 陈俊来    时间: 2012-9-18 18:15
我认为是两个对象
String s=new String("xzy);
创建了2个对象。一个是xzy对象,一个是s




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