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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁桂松 中级黑马   /  2012-5-28 16:14  /  2170 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

1.String a="b",Stirng b="b";创建了几个对象??
2.String a=new String("a"+"b");创建了几个对象??

1,String a="b",Stirng b="b";创建了几个对象??

堆内有一块区域我们称之为字符串缓冲区,String a ="b"去堆内的字符串缓冲区找,是否存在"b"没有就建立"b"然后存储进缓冲区,当到String b = "b";因为缓冲区内已经有了"b"便不再创建.

2.String a=new String("a"+"b");创建了几个对象??
先在堆内建立1个,然后再去字符串缓冲区存储"ab"
String a = new String ("a"+"b"); +字符串连接符,通过JVM自动转成"ab"
堆和字符串缓冲区有什么关系呢?堆是分区域执行操作的,堆内为其开辟了空间,String a = new String ("a"+"b"); 会先在堆内new 出对象,然后把"ab"拿到缓冲区再做比对,如果无这个字符串, 便创建并且存储,那么答案显而易见了,

另画图说明

3 个回复

倒序浏览
我暂时没法回答你的问题,不过我知道有一本书肯定可以回答你《Java虚拟机规范》,现在我正在攻读哪,你需要的话,传给你啊。
回复 使用道具 举报
1.String a="b",Stirng b="b";创建了几个对象??
2.String a=new String("a"+"b");创建了几个对象??
我的看法是这样的,
String a="b",
Stirng b="b";这个是在字符串常量池中只创建了一个对象,因为字符串常量池有一个特点,如果被赋予的值不存在,则会被创建,如果存在,则不会再创建。
String a=new String("a"+"b");创建了2个对象。首先在堆中创建了一个新的对象new String().根据API文档提示说,当有参数时,会自动创建一个新的String,并将"a"+"b"的值赋给新的变量,简单理解一下就是这时候在常量池中就会多创建出一个ab的字符串。
回复 使用道具 举报
李保成 发表于 2012-5-29 00:30
1.String a="b",Stirng b="b";创建了几个对象??
2.String a=new String("a"+"b");创建了几个对象??
我 ...

你的看法与我相同,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马