黑马程序员技术交流社区

标题: 关于String s = new String("xyz"); [打印本页]

作者: 刘学宾    时间: 2012-12-25 19:20
标题: 关于String s = new String("xyz");
String s  = new String("xyz");
“该语句创建了两个字符串对象,一个放在常量区,不管写多少遍,都是同一个;new String每写一遍,就创建一个新对象。”
请牛人说说这句话的意思?常量区是什么?
作者: 一帆风顺    时间: 2012-12-25 19:50
首先要明确String s = new String(“xyz”)是创建了两个对象
一个是字符串xyz,一个是String类型的对象,s这里是个引用变量
而对象一般通过new在堆中创建。

所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,
在编译阶段,会把字符串文字放在常量池中,
常量池的一个好处就是可以把相同的字符串合并,占用一个空间,我们可以用==判断一下两个引用变量是否指向了一个地址即一个对象

而这里的“xyz”就是常量池中的一个对象,在我们 new String()时,把常量池中的字符串"xyz"复制到堆中,
并把这个对象的应用交给s,所以创建了两个String对象,一个在池中,一个在堆中。

再来说常量池,根据名字来看,就是放常量的地方,可以使得我们定义的字符串等再运行中不会变化

作者: 郑广昌    时间: 2012-12-25 23:06
王博 发表于 2012-12-25 19:50
首先要明确String s = new String(“xyz”)是创建了两个对象
一个是字符串xyz,一个是String类型的对象, ...

回答好透彻,me也懂了!
作者: 黑马-邢广耀    时间: 2012-12-26 09:39
先解释一下常量区,这是为了方便与存储全局的固定不变的值而分配的一块儿内存区域,
再说这里有几个对象,有两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。




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