黑马程序员技术交流社区

标题: String的对象创建 [打印本页]

作者: 马上都有    时间: 2014-5-20 18:19
标题: String的对象创建

问题是这样的:
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
输出了true;

String str3 = "efg";
String str4 = new String("efg");
System.out.println(str3 == str4);
结果是false;


作者: ۩大世界小人物    时间: 2014-5-20 20:01
  1. String s = "abc";//创建一个字符串对象在常量池中。
  2. String s2 = new String("abc");//创建两个对象   一个new  一个字符串对象在堆内存中。
  3. boolean b = (s==s2);//b为false   比较的是地址
  4. boolean b2 = s.equals(s2);//b2为true   重写了Object的equals方法,  比较的是俩个字符串的内容。
复制代码

作者: youcyou    时间: 2014-5-20 22:23
前一组在常量池中只有一个“abc”str2只是增加了一个指针
后一组一个在常量池一个是new的对象 而==比较的是是否为一个对象
所以是false

作者: amao    时间: 2014-5-20 23:37
1.只要记得 “==“是比较的两个对象的引用,是个地址值,有内存分配的。

2.上面的是在常量池中创建了一个字符串对象“abc”,并且分配了一个地址值,然后str1指向它,str2创建时,因为对象存在于常量池中,内存就不再创建新的“abc”,而是将str2指向它,所以两个的地址值是一样的,即为true;

3.下面这个,new String(),JVM就会在栈内存中开辟一个新的空间,并且有一个地址值,给这个对象赋值时是将字符串"abc"的地址赋给了它。所以,String str2 = new String("abc");内存中有两个对象,str2指向来栈内存中的那个String对象。而str1指向的是“abc”的引用,两个指向的地址值不同,所以为false。
作者: ID1003    时间: 2014-5-20 23:51
本来想回复讲解一下呢,看了2楼的解释,觉得没必要再多说什么了。
作者: 小黑驴    时间: 2014-5-20 23:58
我来完了,2楼正解
作者: Jero    时间: 2014-5-21 00:00
说的都说完了。 == 是比较物理地址  equals 比较值。
作者: 寻找人生目标    时间: 2014-5-21 00:02
二楼正解                                                




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