本帖最后由 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"就变垃圾了
-------------------------------------------------------------------------------------------------------------------------------------
不一定对啊小伙子,但是我就是这么理解的,错了别喷我啊,手打蛮辛苦的...
|