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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 四海为家 初级黑马   /  2012-3-19 22:48  /  1634 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s = new String("xyz");这里new了一次,不就是一个对象吗?可是答案却是错误的?说是两个对象,另一个对象在哪里呀?

5 个回复

倒序浏览
第一个对象是字符串常量"xyz"
第二个对象是new String("xyz")的时候产生的,在heap中分配内存给这个对象,只不过这个对象的内容是指向字符串常量"xyz"
另外还有一个引用s,指向第二个对象。这是一个变量,在栈中分配内存。

当然,这个s应该不算是对象,而只是一个引用类型的变量。
回复 使用道具 举报
字符串类型比较特殊 内存中有一个字符串常量池 。
String s1 = new String("abc");是在堆中生成一份,还会在常量池中生成一份。
常量池的作用如下
比如 String str1 = "abc"; //这时假设在常量池里有个没有"abc"就生成一个放进去。
        String str2 = “abc”//时在常量池里寻找“abc” 找到了就用它,这样就节省下了一份"abc"占的内存。
回复 使用道具 举报
一个是字符串字面量"xyz"所对应的、驻留在一个全局共享的字符串常量池中的实例,另一个是通过new String(String)创建并初始化的、内容与"xyz"相同的实例。
回复 使用道具 举报
在java中,对字符串的创建以及存取采用了缓存机制, 虚拟机内置了一个常量池的一块内存,
每当创建了一个字符串时,虚拟机先到常量池中查找是否存有该字符串, 如果有则不再创建 ,直接使用, 如果没有就创建一个,并存入常量池,
String s = new String("xyz");对于这句话, 我们知道创建一个字符串有好些方式, 其中方式之一,直接写"abc"就已经在内存中创建了一个字符串,
当你在new一个相同内容的String时,虚拟机去常量池看了看, 已经有了abc ,所以就不再创建了,直接拿来使用
回复 使用道具 举报
本帖最后由 陈汉帆 于 2012-3-20 14:29 编辑

楼上的不对啊,按你的意思,那就是只创建一个对象了
当String a =“xyz”时,"xyz"会被换入常量池,这时再String b =“xyz”,虚拟机会去常量池查找,查到了,就不会再创建对象,而是把"xyz”的引用赋给b,此时只创建一个对象;
如果是用new方式(凡是new出来的对象都放到堆内存中),虚拟机不会去常量池查找,而是在堆内存中重新创建一个对象,代码String s = new String("xyz");其中括号中的"xyz”创建了匿名对象,new又重新创建对象,所以创建了两个对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马