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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王春艳 于 2011-10-7 00:57 编辑

答案是两个或一个,不是很明白

6 个回复

倒序浏览
据说这是一道很没有意义的面试题
也据说答题是两个,一个是“xyz”,一个是指向“xyz”的引用对象s。
至于为什么,请移步到http://www.iteye.com/topic/774673
回复 使用道具 举报
实际上是两个对象放在堆内存里面。里面的xyz 是一个对象;通常我们有这样写:String str = "xyz" 这里就创建了一个对象及一个栈里面的引用; 外面的 new String()也创建了一个对象,放在堆内存。只不过"xyz"并没有创建引用。他问的可能是引用对象呢?还是指堆内存里面的对象?所以答案是两个。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
2个,一个是编译时决定的,最后放在常量池中。一个是运行时放在堆里面的。两个都是"xyz",我只能这么说了。还有的,s确实只是一个引用,本身不是对象。java不是纯粹的面向对象,也就是说并不是所有的都是对象,如基本类型等

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
当new的时候就创建了一个对象,“abc"表示的也是一个对象。所以有两个对象。
回复 使用道具 举报
是两个对象,这道题老师的视频里有讲,你可以去看下,那里讲的很清楚
回复 使用道具 举报
李文肖 黑马帝 2011-10-8 10:54:55
7#
本帖最后由 李文肖 于 2011-10-8 10:57 编辑

两个!

        "xyz "作为一个常量字符串首先被创建,它被保存在“串池”中。所谓串池,简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存的地方。在串池中已经存在 "xyz "这个串的情况下,如果你需要一个内容相同的串,你不需要再次创建一个,而是直接用这个就可以,这样当然是为了节省空间。注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。
        当然,使用new   String也创建了一个对象, "xyz "作为传入构造方法的实际参数,其含义就是:我要创建一个串,它的内容和串池中的 "xyz "内容一致!

        首先你要理解constant   pool,   这是一个特殊的共享区域,literate,   Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。 如果你用了String   s   =   new   String( "xyz "); 那么,会有两个String被创建,一个是你的Class被CLassLoader加载时,你的 "xyz "被作为常量读入,在constant   pool里创建了一个共享的 "xyz " 然后,当调用到new   String( "xyz ")的时候,会在heap里创建这个new   String( "xyz ");

        但是如果你把String   s   =   new   String( "xyz ").intern(); 那么具体过程变成,现在heap里创建一个String,   然后调用intern()方法,发现constant   pool里存在 'xyz ',然后就会返回constant   pool内对象的引用,稍后heap里的就not   reachable了,会被gc,最终VM里只有一个 "xyz

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马