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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄奕豪 于 2012-5-23 13:37 编辑

今天终于进入第十三天的学习了,可是刚看了第一个视频就有疑惑了,希望大家指点指点

第一:毕老师说了,下面str1和str2的区别在于str1在内存中有一个对象,str2有两个对象,那具体是哪两个对象?难道说是堆内存中new了一个String对象算一个,然后里面包含了前面的“abc”对象么?
String str1 = "abc";
String str2 = new String("abc");

第二:还是这两个对象,用 str1.equals(str2) 比较的结果是True,明白了,是因为String复写了Object的方法,比较的是内容,可是 str1 == str2 呢?这个难道就是Object里面的方法么?它比较的也是地址值么?
String str1 = "abc";
String str2 = new String("abc");

第三:常量池的问题,系统内有个常量池,毕老师说了这是一个字符数组存储的!那我们新建的String str1 = "abc";对象里面,“abc”里面存的是常量池字符数组的角标(95、96、97)呢?还是abc这几个字符的值?又或者是新建完“abc”以后,将“abc”存回这个常量池,作为一个新的常量供下一个字符串对象使用?(个人觉得这个没可能吧,不算符号字符,就算26个字母,排列组合出来得要多大的存储啊!但是毕老师的视频里面似乎是这样说的,不知道是我理解错了,还是真的是这样!)

第四:字符串对象一旦初始化就不能改变,那String str1 = "abc"; str1 = "abc"+"d";后面的语句执行后,堆内存中的变化是这样么?先新建一个“d”对象,然后根据对象“abc”和“d”的内容新建一个“abcd”对象,再把“abcd"对象的地址值赋值给 str1,接着“abc”和“d”被垃圾回收,是这样理解么?

小学数学没学好,伸两个手指问4个问题,还希望各路豪杰多担待啊!!还有多谢沙发童鞋的指正,改过来了!!是String str2 = new String("abc");不是:String str2 = new String("abd");刚看美女,大意了,莫见怪啊!!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 赞一个!

查看全部评分

10 个回复

正序浏览
ttkl123654 发表于 2012-5-24 07:21
都是刚学,似懂非懂的,把问题弄清楚学明白我觉得挺好的,日后发展不会受基础限制。再者怎么也是一个学习态 ...

我查了一些文档,里面说相同的对象可以有不同哈希值的,这个涉及到了后面说的集合里面的set无序集,我没看到那个所以现在也看不懂!!那就暂时按照自己的理解去吧,以后有机会接触到就了解了!~!加油!!
回复 使用道具 举报
呵呵,好难记住啊.....但还得记啊.....
回复 使用道具 举报
383366684 发表于 2012-5-23 21:55
学习13天就这么难啊,晕了

安啦,前面弄懂以后后面的都可以很简单的过的,我这个问题可能是我钻牛角尖而已~~~搞不懂应该问题也不大,当然搞得懂最好!!
回复 使用道具 举报
ttkl123654 发表于 2012-5-23 21:54
第一:
"abc" 是一个对象,new 新建了一个。
System.out.println("abc" == new String("abc"))//用语句试一 ...

第三
str1 = "abc"//在常量池中查找,如果没有就新创建,不是原来就存在的。
那创建之后是否保存?常量池真要把所有出现过的类似字符串都存完么?
第四
按我的理解,“abc”和“d”创建了就不回收了,String实例一但生成就不会再改变了。
这个我表示不理解,如果String生成就不改变了,不回收,那内存的压力太大了吧,所以有可能是一个回收时间的问题吧,可能超过一定时间没人再用了就回收!但是这个时间是多少?
回复 使用道具 举报
学习13天就这么难啊,晕了
回复 使用道具 举报
whocases 发表于 2012-5-23 17:32
回答第一个问题:String str1 = "abc";
String str2 = new String("abc");
str1在内存中只有一个对象,str ...

呵呵,共同学习啊!!
回复 使用道具 举报
回答第一个问题:String str1 = "abc";
String str2 = new String("abc");
str1在内存中只有一个对象,str2有两个对象,分别是:“abc”算一个,str2也算一个(str2是个引用,指向了字符串“abc”)。
回答第二个问题:
“==”两边如果是简单数据类型的话,比较的就是值,如果是对象引用的话,比较的就是对象引用的地址,而不是引用指向的内容;比较对象是否相等的话,使用equals方法
第四个问题:String str1 = "abc"; str1 = "abc"+"d";初始化过程,我理解的跟你差不多;至于 "abc" 和"d" 在不在内存。这个好像是jvm的回收机制的问题了
不过,用完一个对象,不想让它占内存,给这个对象的引用赋值为null,关闭引用和对象的关系,这样jvm会去处理这个没用的对象;

说明:以上是我的理解后的想法,如果不对,请批评指正,希望共同进步;谢谢;

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
String str2 = new String("abc");这句话创建的是在栈内存中abc对象的的副本对象。为了节省内存,它指向abc对象。
str1 == str2只是纯粹的比较两个对象的地址值,它不是方法。
“字符串对象一旦初始化就不能改变,那String str1 = "abc"; str1 = "abc"+"d";后面的语句执行后,堆内存中的变化是这样么?先新建一个“d”对象,然后根据对象“abc”和“d”的内容新建一个“abcd”对象,再把“abcd"对象的地址值赋值给 str1“这样理解完全没问题,关于垃圾回收我也不是很清楚,期待高手补充{:soso_e100:}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
冯越 发表于 2012-5-23 12:50
是abc 还是 abd?

我错了!!是abc~~~:Q
回复 使用道具 举报
是abc 还是 abd?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马