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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© IDhmpj 中级黑马   /  2015-4-24 23:01  /  622 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 IDhmpj 于 2015-4-25 23:18 编辑

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

10 个回复

倒序浏览
第一个生成一个对象。。第二个生成两个。。
回复 使用道具 举报
Chans_宇 发表于 2015-4-24 23:18
第一个生成一个对象。。第二个生成两个。。

为啥呢?
回复 使用道具 举报
"abc"这个字符串是在字符串常量池中创立的,这是第一个对象;
回复 使用道具 举报
String类是个特殊引用类……直接赋值会在常量池生成对象,这个地址会被变量str 直接引用;另一个是先在常量池生成String的实例对象(也就是abc),再在堆内存生成一个String类对象,然后常量池里生成的“abc”的地址会赋给堆内存的String对象。刘意老师视频有详细讲解……
回复 使用道具 举报
new 是在堆内存中创立的另外一个对象,第二个的过程是:现在常量池中建立字符串对象“abc"生成地址值。然后在堆内存中创立对象存储在常量池中的”abc“对象的地址值,这个对象本身也产生一个地址值。最后一步是栈内存中创立变量str 变量中存储堆内存的地址值, 所以 整个过程是由 str 指向堆内存,再由堆内存指向常量池"abc" 。 希望对你有帮助
回复 使用道具 举报
有点类似C中的二级指针
回复 使用道具 举报
onETT 中级黑马 2015-4-25 00:34:39
8#
第一个新建了一个栈中的对象。 第二个 新建了一个栈中的对象,和一个堆中的对象。
回复 使用道具 举报
两个都是只new了一个字符串对象。。不知道我说的对吗
回复 使用道具 举报
来学习学习
回复 使用道具 举报
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"所在位置地址.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马