黑马程序员技术交流社区

标题: string类的俩个创建方式疑问 [打印本页]

作者: 我自信我很牛    时间: 2013-3-21 20:28
标题: string类的俩个创建方式疑问
本帖最后由 烟磊磊 于 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 20:35
st 在内存中有一个对象。
st1 在内存中有两个对象。 {:soso_e128:}
作者: 张文星    时间: 2013-3-21 20:35
第一个是直接创建一个字符串对象,而第二个则是创建参数字符串的副本,也就是一个新的引用,所以说,第一种方式要比第二种方式快一点,节约资源。
作者: 林慎    时间: 2013-3-21 20:37
s1在内存中有一个对象 s2在内存中有两个对象。
作者: 安鹏宇    时间: 2013-3-21 21:05
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
楼上正解
作者: 小路飞    时间: 2013-3-21 21:47
本帖最后由 侯国奇 于 2013-3-21 21:49 编辑

String st="abc";
String st1=new String("abc");
第一句在内存中创建了字符串“abc”,存放在常量池中。
第二句若是单独存在,即之前没有第一句,则会创建两个对象,即“abc”和new出来的东西。但是因为有第一句的存在,在常量池中已经有了“abc”,所以不会再创建“abc”,仅new在堆内存开配空间。
另外,因为两句最后效果一样,而第二句又有可能产生垃圾,故一般推荐用第一句。




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