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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【题目】下面这句话在内存中创建了几个对象?
                String s1 = new String("abc");
【疑问一】题中代码是否等效于下列代码?
                String str = "abc";
                String s1 = new String(str);

【疑问二】下面画的图解是否正确?
【疑问三】既然是在常量池和栈内存分别创建了一个对象, 那么两个对象的地址值应该不同, 怎么能看到这个两个对象的地址值?
【疑问四】如果【疑问一】中的代码是等效的, 那么, 为什么str和s1的地址值不同, 而哈希地址却相同呢??
                String str = "abc";
                String s1 = new String(str);
                System.out.println("第一对象哈希地址值:"+str.hashCode());
                System.out.println("第二对象哈希地址值:"+s1.hashCode());

                //运行结果相同!!!为什么???

图片1.png (16.62 KB, 下载次数: 17)

图片1.png

7 个回复

倒序浏览
String str=new String("abc");创建了一个对象
回复 使用道具 举报 0 1
本帖最后由 65708535 于 2016-4-8 17:42 编辑

【题目】下面这句话在内存中创建了几个对象?
                String s1 = new String("abc");        //两个对象,一个在堆内存,一个在常量池,堆内存中那个对象里储存了一个常量池"abc"的副本(如你那张图)
【疑问一】题中代码是否等效于下列代码?        //不知道这个等效是不是你要问的意思- -                                                                                                                                                // ==运算符是不等于的,比较的是地址值(不看里面数据),你创建了两个对象每个对象有对应的地址值                                                                                           //equals等于的,比较的是里面的值"abc"
                String str = "abc";
                String s1 = new String(str);

【疑问二】下面画的图解是否正确?                 //正确的
【疑问三】既然是在常量池和栈内存分别创建了一个对象, 那么两个对象的地址值应该不同, 怎么能看到这个两个对象的地址值?
//题目应该是常量池和堆内存吧//因为String类都是重写了toString的,所以你在这个类里是只能看到返回的属性值,你可以自己新创建一个Student类但不要重写toString方法,比如
        Student s1 = new Student("张三",23);
        Student s2 = new Student("张三",23);
        System.out.println(s1);
        System.out.println(s2);
com.heima.Student@b9e45a
com.heima.Student@3ef810

【疑问四】如果【疑问一】中的代码是等效的, 那么, 为什么str和s1的地址值不同, 而哈希地址却相同呢??
                String str = "abc";
                String s1 = new String(str);
                System.out.println("第一对象哈希地址值:"+str.hashCode());
                System.out.println("第二对象哈希地址值:"+s1.hashCode());

                //运行结果相同!!!为什么???      
//String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同(通俗点讲就是只要里面的东西一样就一样,具体为什么可以等到后面集合视频里会讲Hash的问题,String类里只是为了引出重写toString而已)

//地址值不同因为创建了两个对象,s1中new了一个对象这个对象本身有个地址(不看里面东西到底一样不一样,就比如你家楼上和你家户型一模一样,装修家具全都一模一样,但是你家地址是100号101室,他家就是100号201室),所以就算里面都是"abc",你没有地址你怎么进家门的,你不进家门怎么判断里面是不是"abc"
"abc"也可以看作一个字符串对象存在常量池里 并且String str = "abc"; 只能被赋值一次,如果被赋值第二次str = "def";前面那个"abc"就变垃圾了
-------------------------------------------------------------------------------------------------------------------------------------
不一定对啊小伙子,但是我就是这么理解的,错了别喷我啊,手打蛮辛苦的...

回复 使用道具 举报
carrykhu 来自手机 中级黑马 2016-4-8 17:47:21
板凳
我先看看书
回复 使用道具 举报
65708535 发表于 2016-4-8 17:34
【题目】下面这句话在内存中创建了几个对象?
                String s1 = new String("abc");        //两 ...

正解, 我喜欢! 谢谢这位兄弟! 只是对那个"只要内容一样, 哈希码值就一样"有点疑虑, 我再研究一下, 十分感谢!!!
回复 使用道具 举报
IT小笨鸟 发表于 2016-4-8 16:32
String str=new String("abc");创建了一个对象

创建了两个对象, 常量池一个, 栈内存一个!
回复 使用道具 举报
li6232876 发表于 2016-4-8 19:05
创建了两个对象, 常量池一个, 栈内存一个!

兄弟对象进的是堆内存~哈希值的问题千万别钻牛角尖,因为这个东西是底层的东西,你要查得查源码很浪费时间额,关键还看不懂,看JDK API搞懂概念运用为主...
你记住:
1:String类:里的内容一样,哈希值以一定一样
2:Object类:我让你new的那种自己新建的例如Student类的,没有修改过toString类的都是默认继承的Object类,hashCode的值经过特殊结构处理,由于每个对象在内存在不一样的位置,所以就算内容一样,哈希值也不一样,你可以去试Student那个哈希值过个一秒就不一样的
3:Integer类和String类一样,里面内容一样值就一样

回复 使用道具 举报
每天看论坛也是学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马