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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我自信我很牛 中级黑马   /  2013-3-21 20:28  /  1530 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 烟磊磊 于 2013-3-21 21:24 编辑

class  Demo1
{
public static void main(String[] args)
{
  String st="abc";
  String st1=new String("abc");
  System.out.println(st.toString());
  System.out.println(st1.toString());
}
}
以上两种方法创建的字符串对象,不知道有什么区别,在底层的存储,应用场合方面讲一下。

点评

如果你的问题已经得到解决。请及时将主题改为[已解决],如果还有问题请继续追问,谢谢  发表于 2013-3-21 21:20

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

6 个回复

正序浏览
小路飞 来自手机 中级黑马 2013-3-21 21:47:08
7#
本帖最后由 侯国奇 于 2013-3-21 21:49 编辑

String st="abc";
String st1=new String("abc");
第一句在内存中创建了字符串“abc”,存放在常量池中。
第二句若是单独存在,即之前没有第一句,则会创建两个对象,即“abc”和new出来的东西。但是因为有第一句的存在,在常量池中已经有了“abc”,所以不会再创建“abc”,仅new在堆内存开配空间。
另外,因为两句最后效果一样,而第二句又有可能产生垃圾,故一般推荐用第一句。
回复 使用道具 举报
楼上正解
回复 使用道具 举报
String st1=new String("abc");是java中标准的对象创建方式,其创建的对象将直接放置到堆中,
每调用一次就会创建一个新的对象;
系统会先创建一个匿名对象"abc"存入堆内存,然后new关键字会在堆内存中又开辟一块新的空间,
然后把"abc"存进去,并且把地址返回给栈内存中的st1, 此时第一次放入的abc对象成为了一个垃圾对象,
因为它没有被任何栈中的变量指向,会被垃圾回收自动回收。

String strA = "abc";  
String strB = "abc";
首先会去缓冲池中找有没有一个"abc"对象,如果没有,则新建一个,并且入池,所以此种赋值有一个好处,
下次如果还有String对象也用直接赋值方式定义为“abc”, 则不需要开辟新的堆空间,而仍然指向这个池中的"abc"
s trA和 strB 都是指向同一个内存地址

实际应用中应该直接赋值更简便,节省资源吧。

点评

给力。。。瞬间清晰了  发表于 2013-3-21 21:06

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
s1在内存中有一个对象 s2在内存中有两个对象。
回复 使用道具 举报
第一个是直接创建一个字符串对象,而第二个则是创建参数字符串的副本,也就是一个新的引用,所以说,第一种方式要比第二种方式快一点,节约资源。
回复 使用道具 举报
st 在内存中有一个对象。
st1 在内存中有两个对象。 {:soso_e128:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马