黑马程序员技术交流社区

标题: 基础疑惑:String s = new String("abcd") [打印本页]

作者: 阿旺    时间: 2014-4-24 15:47
标题: 基础疑惑:String s = new String("abcd")
本帖最后由 阿旺 于 2014-4-25 09:18 编辑

String  s = new String("abcd");
这语句创建了多少个String对象?是一个还是两个,请教大家,分析一下,谢谢

作者: 悠然丶    时间: 2014-4-24 16:03
String  s = new String("abcd");
在内存中创建了2个对象.一个在常量池,另一个在堆内存中
首先在栈内存中有一个变量s引用指向堆内存的new String()对象
而堆内存的new String 记录的是在常量池中的abcd的地址


作者: kuroro自走核炮    时间: 2014-4-24 16:13
两个 常量池里的“abcd”和堆内存里的String
作者: eternallove    时间: 2014-4-24 16:15
是两个,String类本来就是final类,当它在创建对象时,它先在常量池里创建这个字符串的一个对象,又因为它是使用了new关键字,所以呢它又会在堆内存中存一个new String()对象.实际上它和String str=“abcd”;的区别就在此处,一个是会创建两个对象,常量池一个,堆内存一个。另一个会创建一个对象,只有常量池中的一个。根据那个new关键字进行思考和记忆,就OK了,希望能帮到你。。。
作者: 程序爱好者    时间: 2014-4-24 16:15
我们常用的创建一个类的实例(对象)的方法有以下两种:

一、使用new创建对象。  

二、调用Class类的newInstance方法,利用反射机制创建对象。

我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了s变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abcd"。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本

作者: skill20    时间: 2014-4-24 18:27

String  s = new String("abcd");创建了两个对象,new出一个对象,“abcd”也是一个对象,这个对象放在常量池中。
String s = “abcd”;这个是创建了一个对象。

作者: 2528870651    时间: 2014-4-24 19:38
String 字符串 = "字符串内容";
使用了缓冲池机制,在内存中只开辟了一个内存空间
String 字符串 = new String("字符串内容");
没有使用缓冲池机制,在内存中开辟了两个内存空间


String s = “aaa”;(采用字面值方式赋值)
1)  查找 String Pool(字符串池)中是否存在“aaa”这个对象,如果不存在,则在 String Pool 中创建
一个“aaa”对象,然后将 String  Pool 中的这个“aaa”对象的地址返回来,赋给引
用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
2)  如果存在,则不创建任何对象,直接将 String Pool中的这个“aaa”对象地址返回来,
赋给 s 引用。
String s = new String(“aaa”);
1)  首先在String Pool 中查找有没有“aaa”这个字符串对象,如果有,则不在 String Pool
中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对
象,然后将堆中的这个“aaa”对象的地址返回来,赋给 s 引用,导致 s 指向了堆中
创建的这个“aaa”字符串对象。
2)  如果没有,则首先在 String Pool中创建一个“aaa“对象,然后再在堆中(heap)创
建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给 s 引用,
导致 s 指向了堆中所创建的这个”aaa“对象。





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