黑马程序员技术交流社区

标题: 关于String的问题 [打印本页]

作者: 四海为家    时间: 2012-3-19 22:48
标题: 关于String的问题
String s = new String("xyz");这里new了一次,不就是一个对象吗?可是答案却是错误的?说是两个对象,另一个对象在哪里呀?
作者: 叶绍亮    时间: 2012-3-19 23:07
第一个对象是字符串常量"xyz"
第二个对象是new String("xyz")的时候产生的,在heap中分配内存给这个对象,只不过这个对象的内容是指向字符串常量"xyz"
另外还有一个引用s,指向第二个对象。这是一个变量,在栈中分配内存。

当然,这个s应该不算是对象,而只是一个引用类型的变量。
作者: 魏群    时间: 2012-3-19 23:10
字符串类型比较特殊 内存中有一个字符串常量池 。
String s1 = new String("abc");是在堆中生成一份,还会在常量池中生成一份。
常量池的作用如下
比如 String str1 = "abc"; //这时假设在常量池里有个没有"abc"就生成一个放进去。
        String str2 = “abc”//时在常量池里寻找“abc” 找到了就用它,这样就节省下了一份"abc"占的内存。

作者: 盛祖华    时间: 2012-3-19 23:19
一个是字符串字面量"xyz"所对应的、驻留在一个全局共享的字符串常量池中的实例,另一个是通过new String(String)创建并初始化的、内容与"xyz"相同的实例。

作者: a504079589    时间: 2012-3-20 00:42
在java中,对字符串的创建以及存取采用了缓存机制, 虚拟机内置了一个常量池的一块内存,
每当创建了一个字符串时,虚拟机先到常量池中查找是否存有该字符串, 如果有则不再创建 ,直接使用, 如果没有就创建一个,并存入常量池,
String s = new String("xyz");对于这句话, 我们知道创建一个字符串有好些方式, 其中方式之一,直接写"abc"就已经在内存中创建了一个字符串,
当你在new一个相同内容的String时,虚拟机去常量池看了看, 已经有了abc ,所以就不再创建了,直接拿来使用
作者: 陈汉帆    时间: 2012-3-20 14:28
本帖最后由 陈汉帆 于 2012-3-20 14:29 编辑

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




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