黑马程序员技术交流社区

标题: String类的小问题,求解释 [打印本页]

作者: 吴凯    时间: 2013-5-3 01:11
标题: 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;

作者: 吴凯    时间: 2013-5-3 01:12
为什么第二个例子会是 false
作者: 花开花落总相似    时间: 2013-5-3 07:57
  存放的位置不一样
String str1 = "abc";  // date segment
String str2 = "abc"; //date segment
System.out.println(str1 == str2);
输出了true;

String str3 = "efg";  // date  segment
String str4 = new String("efg");  //堆内存空间
System.out.println(str3 == str4);
结果是false;
   date segment 是存放 字符串常量和静引态变量的地方 同时呢 他还对立面的内容有一个优化  当date segment里面存在一个字符串常量的时候,他就不会再创建了 也就是说 str1 创建了一个 abc  str2就不会创建了 他直接指向str1的对象  两个引用指向一个相同的对象 所以 str1 == str2当然是真。  而下面str4你new出来的对象存在堆内存里面  str3和str4当然不等的了         说的不好的话还请见谅  呵呵

作者: 海不扬波    时间: 2013-5-3 09:18
String str3 = "efg";是在栈内存中
String str4 = new String("efg");这个是实例化对象,是在堆内存中,两个内在地址值不一样,所以是false啦。
作者: 一直在路上    时间: 2013-5-3 09:30
问题是这样的:
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
输出了true;

String str3 = "efg";是放在栈内存中,通过赋值得到的常量都是放在栈内存中
String str4 = new String("efg");通过new获得的对象都是放在堆内存中,只是提供了一个地址指向这个对象,所以结果肯定不一样了啊。

作者: 于海龙    时间: 2013-5-3 09:38
==  比的是对象("abc")地址.
如果"abc"存在, str2指向此地址不会新创建对象。两者比较为true
new出来的都会新创建对象,所以指向地址不同,两者比较为false.
作者: 孟群峰    时间: 2013-5-3 09:51
String str1 = "abc";
String str2 = "abc";
第一句执行时,"abc"被创建存储在String常量池中,并返回其地址。
第二句执行时,虚拟机会先查找是否有将要创建的字符串,如果有直接返回其地址
所以第一句和第二句创建的字符串的地址相同。System.out.println(str1 == str2);则为true。
String str3 = "efg";
String str4 = new String("efg");
第一句和上面相同,字符串被创建在string常量池中,返回常量池中的地址。
第二句使用new创建字符串在对内存中,返回堆内存中的地址。
所以两个语句创建的字符串地址一定不相同
System.out.println(str3 == str4);为false
懂了吗楼主?



作者: 曹德君    时间: 2013-5-3 10:10
是这样子的。第一个情况,str1="abc"和str2是开辟的同一个对内存空间的,他们是同一个对象。第二种情况因为你是用new相当于建立了两个对象。而==是比较两个对象的地址值,所以第一个就会是true第二个是false。
作者: harborbest    时间: 2013-5-3 10:57
这个问题问的人实在是太多了!而且也有很多人都做回答了!
作者: 李阳阳    时间: 2013-5-3 14:39
"=="用来比较对象时,是比较地址值。就是要对象内容和地址是否相同,equals()比较对象时只要对象内容相同就行。
代码:
class  EqualDemo
          {
              public static void main(String[] args)
              {
                  String str1 = new String("hello");
                  String str2 = new String("hell0");
                  String str3 = str2;
                  //用“==”比较str1与str2
                  System.out.println("str1与str2的比较结果为:"+(str1==str2));
                 //用“==”比较str2与str3
                  System.out.println("str1与str2的比较结果为:"+(str2==str3));
                 //用equals方法比较str1与str2
                  System.out.println("str1与str2的比较结果为:"+str1.equals(str2));
                 //用equals方法比较str2与str3
                 System.out.println("str1与str2的比较结果为:"+str2.equals(str3));
              }
          }

qq.jpg (47.36 KB, 下载次数: 0)

qq.jpg

作者: 吴文彬    时间: 2013-5-3 18:26

String str1 = "abc";
String str2 = "abc";
第一句执行时,"abc"被创建存储在String常量池中,并返回其地址。
第二句执行时,虚拟机会先查找是否有将要创建的字符串,如果有直接返回其地址
所以第一句和第二句创建的字符串的地址相同。System.out.println(str1 == str2);则为true。
1.String str3 = "efg";
2.String str4 = new String("efg");
第一句属于字符串常量赋值,jvm是先去检查字符串常量池,如果常量池中没有"efg"这个字符串,则在String常量池中创建,并返回该字符串在常量池中的地址;如果常量中有"efg"这个字符串,直接返回该字符串在常量池中的地址。如果字符串被创建在string常量池中,有且只有一份,返回常量池中的地址。所以相等。
第二句是使用new在堆内存中创建字符串对象,每一个新创建的对象都是唯一的,所以返回堆内存中的唯一的地址。所以不相等。
作者: 黄玉昆    时间: 2013-5-3 22:09
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




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