黑马程序员技术交流社区
标题:
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