黑马程序员技术交流社区

标题: String s=new String("abc"); new了几个对象 [打印本页]

作者: 杨永峰    时间: 2012-5-27 21:08
标题: String s=new String("abc"); new了几个对象
本帖最后由 杨永峰 于 2012-5-27 21:32 编辑

如题:String str =new String("string");  new了几个对象??

—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——

补问:String str="string"; 创建了几个对象??
           ————————————————————
  1. String str_1 = "string";
  2. String str_2 = "string"; ///以上两行代码创建了几个对象?
复制代码
  1. String str = "str" + "ing";///以上一行代码创建了几个对象?
复制代码

作者: 邹颖    时间: 2012-5-27 21:21
  new 了一个对象. .   
  因为“String”  是在常量池中产生了一个常量字符串对象, 不是通过new出来的。  所以真正在堆内存中new出来的只有一个对象,
只不过是将常量池中的String字符串拷贝到了堆内存上。
作者: 钟成军    时间: 2012-5-27 21:25
只new 了一个字符串常量
作者: 陆建平    时间: 2012-5-27 21:31
Stirng str1 = new String("string");

//这个产生了2个对象,一个是new关键字创建的new Sring();另一个是“string”对象,abc在一个字符串池中str1这个对象指向这个串池
解释下字符串池:他是一个由字符组成的一个数组就相当于char str1 =new char[]{a,b,c};
如果不是遇到新的字符串,则直接指向原来的串池,如果遇到新的字符串则创建一个新的串池,个人以为因为java基本类型中中没有String类型,所以当出现新的字符串的时候需要以上面char 类型来创建一个数组对象。
作者: 安浦鑫    时间: 2012-5-27 21:37
你是要问创建了几个新对象么
创建了2个对象
常量池中一个字符串对象"string"
而在执行new String("string")的时候,则将"string"作为参数传递给构造函数String(String original)
在堆内存中产生了一个新的字符串对象
并且把这个对象的地址赋给了str

所以一共创建了2个对象

附:
String(String original)
          初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
作者: 徐炯    时间: 2012-5-27 22:29
String str_1 = "string";
先检查堆内存中是否存在“string”,如果存在,则将“string”所对应的堆内存地址赋值给str_1,
如果不存在,则在栈内存中创建“string”变量,在堆内存中创建“string”对象,

String str_2 = "string";
同理如上,这时会将String str_1 = "string";创建的对象地址赋值给str_2,

String str = "str" + "ing";
只是进行简单的字符串相加,可以理解为String str = "string";
作者: 王月    时间: 2012-5-27 23:26
本帖最后由 王月 于 2012-5-27 23:27 编辑

是产生了两个对象,new出来一个,常量池中还有一个。
1. new出来的对象在栈内存中。
2."String"这也是个对象,但在常量池里。

String s="string";
这个语句只创建了一个对象,而且存在于常量池中
作者: 路冬冬    时间: 2012-5-27 23:37
String str =new String("string");创建了两个对象,字符串"string"是一个对象,new的String类的str是一个对象,
String str="string";创建了一个对象"string"产生后就直接赋给了str。
作者: 路冬冬    时间: 2012-5-27 23:38
String str =new String("string");创建了两个对象,字符串"string"是一个对象,new的String类的str是一个对象,
String str="string";创建了一个对象"string"产生后就直接赋给了str。
作者: 初艳春    时间: 2012-11-10 11:20
"abc"这个常量字符串是一个匿名的string对象,通过new string()操作又创建了一个对"abc"这个匿名对象的引用s,所以是两个对象
作者: 马纵驰    时间: 2012-11-12 22:54
1问
new 了一个对象。
2问
没有创建对象
作者: 酸溜溜    时间: 2012-12-26 16:17
只不过是将常量池中的String字符串拷贝到了堆内存上。
作者: 焦健    时间: 2013-2-25 21:21
学习学习




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