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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尤圣回 中级黑马   /  2012-9-18 10:51  /  1695 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s=new String("xzy);创建了几个对象
这个答案是2 有些说是1或2 我知道 在特殊情况下是1或2  那真正面试的时候应该说什么答案呢

7 个回复

倒序浏览
在堆内存中创建了个对象,然后看线程池是否已经存在这个对象了,如果存在就不再创建了,如果不存在就创建,所以可能是一个也可能是2个
你就把所有情况说出来就好啦
回复 使用道具 举报
在堆内存中创建了个对象,然后看线程池是否已经存在这个对象了,如果存在就不再创建了,如果不存在就创建,所以可能是一个也可能是2个
你就把所有情况说出来就好啦
回复 使用道具 举报
本帖最后由 严海荣 于 2012-9-18 11:37 编辑

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

所以是2个对象。。

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

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

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



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

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

1.jpg
回复 使用道具 举报
我认为是两个对象
String s=new String("xzy);
创建了2个对象。一个是xzy对象,一个是s
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马