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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1453149997 中级黑马   /  2014-4-2 14:29  /  1323 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 1453149997 于 2014-4-5 14:33 编辑

(1)
String str1="aaa";
String str2="aaa"+"bbb";
按照上面的做法,总共在内存里产生了多少个String对象?
(2)
String str="aaa"+"bbb";
按照上面的做法,总共在内存里产生了多少个String对象?
(3)
String str1="aaa";
String str2=str1+"bbb";
按照上面的做法,总共在内存里产生了多少个String对象?
注意:(1)、(2)、(3)没有直接的关系

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

5 个回复

倒序浏览
由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下:
String str1="aaa";
s = “Java语言”;
其实按照面向对象的标准语法,其格式应该为:
String str1 = new String(“aaa”);
只是按照面向对象的标准语法,在内存使用上存在比较大的浪费。
例如String str1 = new String("aaa");
实际上创建了两个String对象,一个是”aaa”对象,存储在常量空间中,一个是使用new关键字为对象str1申请的空间。
所以(1)在内存里产生了2个String对象,(2)在内存里产生1个String对象

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
String是不可修改的对象。改String内容后都是返回新的对象。

(1)3个
String str1="aaa";   
String str2="aaa"+"bbb";
按照上面的做法,总共在内存里产生了多少个String对象?
答:共3个,
  String str1="aaa";    产生一个
  String str2="aaa"+"bbb";  “abc"根据享元模式就不生成了,"bbb"算一个,  "aaa"+"bbb" 运算后返回
"aaabbb"再算一个。所以共三个.

(2)3个
String str="aaa"+"bbb";
按照上面的做法,总共在内存里产生了多少个String对象?
答:共3个,
  String str2="aaa"+"bbb";  “abc" 算一个 ,"bbb"算一个,  "aaa"+"bbb" 运算后返回
"aaabbb"再算一个。所以共三个.

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 1453149997 于 2014-4-2 16:27 编辑

第二问只会创建一个对象“aaabbb”:
对于第二问String str="aaa"+"bbb"我在网络上搜了一下,说对于这种在源代码级别字符串常量相加的情况,编译器在编译的时候会把它们的+去掉合并为一个常量,那么“aaa”+“bbb”在在编译后会成为“aaabbb”,所以第二问的那句话只会在内存中创建一个对象,即“aaabbb”

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
_Water 发表于 2014-4-2 14:56
由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下:
Str ...

你的结果和原因之间好像缺少一些联系,我无法通过你的原因明白结果。
回复 使用道具 举报
如果是使用完整的定义方式:String str1 = new String(“aaa”);(1)在内存里产生了4个String对象,(2)在内存里产生2个String对象,而使用简化的特殊语法定义,则产生的对象对减半。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马