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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐军涛 中级黑马   /  2012-11-7 16:46  /  2340 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class StringDemo {
       publicstatic void main(String[] args) {
              Strings2 = new String("abc");
              Strings1 = "abc";
              Strings3 = "ab"+"c";
              System.out.println(s1.hashCode());
              System.out.println(s2.hashCode());
              System.out.println(s3.hashCode());
              System.out.println(s1==s2);
              System.out.println(s1==s3);
       }
}
--------------
运行结果:
96354
96354
96354
false
true
------------
疑问:
       s1==s2的结果为什么是false

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

5 个回复

正序浏览
== 要求比较高,需要两个比较的东西是完全一样的,才会返回 true(这个感觉对于java比较难以解释,new String("abc"); 这个是new了一个对象,新开辟了空间,你用 == 其实会去比较他们的地址。而"abc"是在常量区的,他们虽然东西都一样,但是本质不一样,就像你有10块钱,我有10块钱,我的钱和你的钱是相等的,这个就类似于用equals比较,但是我和你是不等的,因为我和你不一样),而 equals是比较里面的东西是不是相等。希望能帮助你去理解这个东西

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
很简单
Strings2 = new String("abc"); “abc”对象在堆中
Strings1 = "abc"; “abc”对象在常量池中

两个变量的指向不一样,当然就是false了!~

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1.首先,你应该知道 ==比较的是什么  
==不仅比较对象的内容,而且比较对象的地址。
   String  s2=new String("abc");  与  String s1 = "abc";
是不相同的,String s2中包含有两个对象,String s1中只有一个对象。
String s2 = new String("abc");   先会在字符串池中寻找到对象“abc”,然后 new会
调用类中的构造函数,创建一个新的对象,而 s2会指向的是新的对象的地址值。
而String s1 = new String("abc");  直接在字符串池中寻找到字符串“abc”,s1指向字符串“abc”的地址。
所以 s1 与s2的地址不同,所以s1 == s2为false
而   “ab”+“c” = “abc”   都是字符串池中的对象 ,地址值相同,所以
            s1==s3为true

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为地址值不一样。 s1指向的地址是在String类的常量池中。而s2指向的地址是在内存的堆中。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
String s2=new String("abc")在内存中创建了两个队形,而s2中存放的是指向"abc"这个对象的地址,在这里的s2是一个引用类型
而String s1="abc"在内存中创建了一个对象,s1在这里是一个类类型变量,“abc”是对象
s1==s3这样判断的话肯定是不一样的了
你用s1.equals(s2)这样就是true了

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马