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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄方 中级黑马   /  2012-3-9 22:41  /  1822 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String  s=new String("xyz") ;问问大家这儿到底创建了几个String Object啊?

9 个回复

倒序浏览
创建 几个String Object? 什么意思?
回复 使用道具 举报
房宝彬 发表于 2012-3-9 22:42
创建 几个String Object? 什么意思?

就是String类型的对象呗!!
回复 使用道具 举报
黄方 发表于 2012-3-10 00:15
就是String类型的对象呗!!

这要看常量池里有没有xyz,如果有的话则创建一个对象,如果没有的话就创建2个对象
回复 使用道具 举报
一个new只能创建一个对象  s引用变量 指向了new String("xxx");   的内存地址  这绝对没问题  
而String s="xxx" ; 虽然也是一个对象  但我觉得应该只有一个对象
    s是一个引用 他只能存放一个内存地址  如果是两个对象的话  有两个内存地址  你说s到底指向谁呢?
         所以我认为是一个对象的   
不知道其他人有什么看法     待观望中  呵呵
回复 使用道具 举报
2个对象!
回复 使用道具 举报
黄方 中级黑马 2012-3-10 12:16:53
7#
小白 发表于 2012-3-10 08:20
2个对象!

为何呀?
回复 使用道具 举报
"xyz”一个,new String("xyz”)又一个,但s指向new String("xyz”)的对象
回复 使用道具 举报
本帖最后由 许圣建 于 2012-3-10 21:07 编辑
这要看常量池里有没有xyz,如果有的话则创建一个对象,如果没有的话就创建2个对象

版主正解。
我补充些细枝末节:
String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能再修改此对象中存储的字符串内容,
就是因为如此,才说String类型是不可变的(immutable)。
String类有一个特殊的创建方法,就是使用""双引号来创建.例如new String("xyz")实际创建了2个String对象,
一个是"xyz"通过""双引号创建的,另一个是通过new创建的.只不过他们创建的时期不同,
一个是编译期,一个是运行期!
增加一道题以便说清楚:
String s1 = new String("s1") ;
String s2 = new String("s1") ;
上面创建了几个String对象?
答案:3个 ,编译期Constant Pool中创建1个,运行期heap中创建2个.
(用new创建的每new一次就在堆上创建一个对象,用引号创建的如果在常量池中已有就直接指向,不用创建)
回复 使用道具 举报
我先不说 创建几个对象,说说基本过程。String str = "aaa";此句话,首先会查找字符串池中会否有"aaa"对象,如果没有先创建对象然后加入到字符串池中;String str = new String("aaa");首先会先创建对象,然后查看字符串池中有没有此字符串,如果没有就加入池中,有就不加入。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马