黑马程序员技术交流社区

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

作者: IDhmpj    时间: 2015-4-24 23:01
标题: 关于String的一个问题
本帖最后由 IDhmpj 于 2015-4-25 23:18 编辑

一道面试题:String str=“abc”;和String str = new String("abc");二者创建的对象个数不一样。谁给分析一下原因。

作者: Chans_宇    时间: 2015-4-24 23:18
第一个生成一个对象。。第二个生成两个。。
作者: IDhmpj    时间: 2015-4-24 23:20
Chans_宇 发表于 2015-4-24 23:18
第一个生成一个对象。。第二个生成两个。。

为啥呢?
作者: 鸡脑壳    时间: 2015-4-24 23:31
"abc"这个字符串是在字符串常量池中创立的,这是第一个对象;
作者: Chans_宇    时间: 2015-4-24 23:32
String类是个特殊引用类……直接赋值会在常量池生成对象,这个地址会被变量str 直接引用;另一个是先在常量池生成String的实例对象(也就是abc),再在堆内存生成一个String类对象,然后常量池里生成的“abc”的地址会赋给堆内存的String对象。刘意老师视频有详细讲解……
作者: 鸡脑壳    时间: 2015-4-24 23:35
new 是在堆内存中创立的另外一个对象,第二个的过程是:现在常量池中建立字符串对象“abc"生成地址值。然后在堆内存中创立对象存储在常量池中的”abc“对象的地址值,这个对象本身也产生一个地址值。最后一步是栈内存中创立变量str 变量中存储堆内存的地址值, 所以 整个过程是由 str 指向堆内存,再由堆内存指向常量池"abc" 。 希望对你有帮助
作者: 马士基    时间: 2015-4-25 00:09
有点类似C中的二级指针
作者: onETT    时间: 2015-4-25 00:34
第一个新建了一个栈中的对象。 第二个 新建了一个栈中的对象,和一个堆中的对象。
作者: 我想努力半年    时间: 2015-4-25 00:46
两个都是只new了一个字符串对象。。不知道我说的对吗
作者: 斷灬dian    时间: 2015-4-25 00:49
来学习学习

作者: 沙迦    时间: 2015-4-25 00:57
String str=“abc“是直接在方法区常量池创建空间并产生一个空间地址并直接赋值给在栈内存中的str变量 而String str = new String("abc")先是在方法区常量池创建空间然后将空间地址传给在堆内存中的new String然后new String将它在堆内存的地址值赋值给在栈内存中的变量Str
  简单点说String str=“abc“是在栈内存中的str直接指向常量池中的"abc"所在位置地址;而String str = new String("abc")先是指向堆内存中的new String  然后new  又指向常量池中的"abc"所在位置地址.




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