黑马程序员技术交流社区

标题: 创建对象的一个面试题分析 [打印本页]

作者: 丁桂松    时间: 2012-5-28 16:14
标题: 创建对象的一个面试题分析
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"拿到缓冲区再做比对,如果无这个字符串, 便创建并且存储,那么答案显而易见了,

另画图说明

作者: xieshuhua    时间: 2012-5-28 23:09
我暂时没法回答你的问题,不过我知道有一本书肯定可以回答你《Java虚拟机规范》,现在我正在攻读哪,你需要的话,传给你啊。
作者: 李保成    时间: 2012-5-29 00:30
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 01:28
李保成 发表于 2012-5-29 00:30
1.String a="b",Stirng b="b";创建了几个对象??
2.String a=new String("a"+"b");创建了几个对象??
我 ...

你的看法与我相同,




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