A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘学宾 中级黑马   /  2012-12-25 19:20  /  1308 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s  = new String("xyz");
“该语句创建了两个字符串对象,一个放在常量区,不管写多少遍,都是同一个;new String每写一遍,就创建一个新对象。”
请牛人说说这句话的意思?常量区是什么?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

3 个回复

倒序浏览
首先要明确String s = new String(“xyz”)是创建了两个对象
一个是字符串xyz,一个是String类型的对象,s这里是个引用变量
而对象一般通过new在堆中创建。

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

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

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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
王博 发表于 2012-12-25 19:50
首先要明确String s = new String(“xyz”)是创建了两个对象
一个是字符串xyz,一个是String类型的对象, ...

回答好透彻,me也懂了!
回复 使用道具 举报
先解释一下常量区,这是为了方便与存储全局的固定不变的值而分配的一块儿内存区域,
再说这里有几个对象,有两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马