黑马程序员技术交流社区

标题: new String对象的问题 [打印本页]

作者: 张淼    时间: 2012-9-28 22:19
标题: new String对象的问题
今天做题碰到了这样一个题目,觉得比较有意思。

String s = new String("xyz");创建了几个String Object?

我的想法是:new String("xyz"); 这句代码在内存中的字符串池中创建了一个"xyz"的字符串,

s是在栈中开辟了一块空间记录xyz字符串的地址,

那这样理解的话是不是创建了一个String Object呢,即xyz
作者: 冯培军    时间: 2012-9-28 22:25
   两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,
都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。
如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。(张孝祥老师这么解释的)
作者: 陈琦    时间: 2012-9-28 22:27
String不是基本类型数据,String对象时存储在堆内存中的,String s 这个引用是在栈中的,这句代码执行完应该创建了两个对象,一个是 位于堆内存中的String,另一个是在字符串池中的 xyz 。(虽然我一直不认为字符串池中的是对象)
作者: 徐-星星    时间: 2012-9-28 22:27
不是这么理解的,是创建了两个String Object,第一个是你说的那个s,然后使用new就是再次创建了一个String Object。
作者: 宫明星    时间: 2012-9-28 22:31
String s = new String( "xyz ");
首先在string池内找,找到?不创建string对象,否则创建, 这样就一个string对象  
遇到new运算符号了,在内存上创建string对象,并将其返回给s,又一个对象  
所以总共是2个对象,一个是string池中的对象,一个是堆中的对象,并把堆中的对象交给s持有
作者: 李铁    时间: 2012-9-28 23:19
String s:是在栈中创建一个引用类型的对象s,new string("xyz"):只要是用new()来新建对象的,都会在堆中创建;所以这里创建了一个;一共就是两个。
作者: 马振兴    时间: 2012-9-29 00:31
翻了下笔记,老毕是这么说的。“xyz”在常量池中创建的不是字符串,而是已字符数组的形式储存,使用时候再挨个调用
创建了2个对象,newl了string对象在堆内存,另一个"XYZ”作为对象在常量池。




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