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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 牛头人图腾 中级黑马   /  2014-3-22 22:28  /  916 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String str = new String("abc");
上面一条语句,创建了两个对象,str引用的对象的是在堆内存中创建的,但对象“abc”是在堆内存创建的还是在方法区的常量池中创建的呢?翻看了毕老师的视频好像也没有表清,只是说创建了两个对象。
System.out.println("abc");对象“abc”是在哪边区域创建的?希望大家解答一下,谢谢。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

3 个回复

正序浏览
本帖最后由 Sage 于 2014-3-22 23:08 编辑

关于String类:
1.String类属于引用数据类型,即可以创建对象(new String())
2.String类有2钟定义方式,①直接用双引号""定义,如String str = "abc";②创建对象后定义,如String str = new String("abc");或String str = new String(); str = "abc";
3.双引号定义定义字符串,使用时都会在内存中查找是否包含该字符串,是就直接引用,否则创建一个对象,可被共享
4.String是全局常量,一经定义不可修改,储存在String池中(pool)

String str = new String("abc");
创建了2个对象,pool(池)中一个,stack(堆)中一个

String str = "abc";
创建了1个对象,pool(池)中一个,双引号定义查看pool中是否存在,无则创建一个

String str = "abc";
String str = new String("abc");
创建了2个对象,pool(池)中一个,stack(堆)中一个
System.out.println("abc");
在pool(池)中创建了一个对象

总之,双引号定义查看pool中是否存在,无则创建一个,创建对象定义会先查看pool中是否存在,有则自身再创建一个,无则创建两个对象

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
王峰峰 发表于 2014-3-22 22:46
首先应该明白的是,一个字符串就是一个String类的匿名对象,而如果使用new关键字,不管如何都会再开辟一个 ...

嗯。谢谢
回复 使用道具 举报
首先应该明白的是,一个字符串就是一个String类的匿名对象,而如果使用new关键字,不管如何都会再开辟一个新的空间,但是此时,此空间的内容还是"abc"。所以String str = new String("abc");
实际上是开辟了两个堆内存空间,真正使用的事new关键字创建的,而另一个则是垃圾空间了。
而System.out.println("abc");对象“abc”还是在堆内存中创建的。:)

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

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