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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张淼 中级黑马   /  2012-9-28 22:19  /  1372 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天做题碰到了这样一个题目,觉得比较有意思。

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

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

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

那这样理解的话是不是创建了一个String Object呢,即xyz

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

6 个回复

倒序浏览
   两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,
都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。
如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。(张孝祥老师这么解释的)

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1 参与有奖

查看全部评分

回复 使用道具 举报
String不是基本类型数据,String对象时存储在堆内存中的,String s 这个引用是在栈中的,这句代码执行完应该创建了两个对象,一个是 位于堆内存中的String,另一个是在字符串池中的 xyz 。(虽然我一直不认为字符串池中的是对象)

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1 参与有奖

查看全部评分

回复 使用道具 举报
不是这么理解的,是创建了两个String Object,第一个是你说的那个s,然后使用new就是再次创建了一个String Object。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1 参与有奖

查看全部评分

回复 使用道具 举报
String s = new String( "xyz ");
首先在string池内找,找到?不创建string对象,否则创建, 这样就一个string对象  
遇到new运算符号了,在内存上创建string对象,并将其返回给s,又一个对象  
所以总共是2个对象,一个是string池中的对象,一个是堆中的对象,并把堆中的对象交给s持有

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1 参与有奖

查看全部评分

回复 使用道具 举报
String s:是在栈中创建一个引用类型的对象s,new string("xyz"):只要是用new()来新建对象的,都会在堆中创建;所以这里创建了一个;一共就是两个。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1 参与有奖

查看全部评分

回复 使用道具 举报
翻了下笔记,老毕是这么说的。“xyz”在常量池中创建的不是字符串,而是已字符数组的形式储存,使用时候再挨个调用
创建了2个对象,newl了string对象在堆内存,另一个"XYZ”作为对象在常量池。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马