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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴凯 中级黑马   /  2013-5-3 01:11  /  3210 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


问题是这样的:
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;

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

13 个回复

倒序浏览
为什么第二个例子会是 false
回复 使用道具 举报
  存放的位置不一样
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当然不等的了         说的不好的话还请见谅  呵呵

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
String str3 = "efg";是在栈内存中
String str4 = new String("efg");这个是实例化对象,是在堆内存中,两个内在地址值不一样,所以是false啦。
回复 使用道具 举报
问题是这样的:
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
输出了true;

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

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
==  比的是对象("abc")地址.
如果"abc"存在, str2指向此地址不会新创建对象。两者比较为true
new出来的都会新创建对象,所以指向地址不同,两者比较为false.
回复 使用道具 举报
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
懂了吗楼主?


评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
是这样子的。第一个情况,str1="abc"和str2是开辟的同一个对内存空间的,他们是同一个对象。第二种情况因为你是用new相当于建立了两个对象。而==是比较两个对象的地址值,所以第一个就会是true第二个是false。
回复 使用道具 举报
这个问题问的人实在是太多了!而且也有很多人都做回答了!
回复 使用道具 举报
"=="用来比较对象时,是比较地址值。就是要对象内容和地址是否相同,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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报

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在堆内存中创建字符串对象,每一个新创建的对象都是唯一的,所以返回堆内存中的唯一的地址。所以不相等。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马