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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dongyangzhang 中级黑马   /  2013-4-17 13:34  /  1304 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 dongyangzhang 于 2013-4-17 17:50 编辑

  1. <p>class A{
  2.     public static void main(String []agrs){</p><p> String a="a";
  3. String b="b";
  4. String c=a+b;
  5. String d="a"+"b";
  6. System.out.println(c=="ab");//运行结果为false
  7. System.out.print(d=="ab");//运行结果为true
  8. }
  9. }</p><p> </p>
复制代码
打印c和d的时候在控制台同样输出的都是ab,为什么判断的时候一个为false一个为true呢?想知道其中的原理,请帮助我分析下,谢谢

3 个回复

倒序浏览
在编程中,通常比较两个字符串是否相同的表达式是“==”,但在Java中不能这么写。在Java中,如果要比较a字符串是否等于b字符串,需要这么写:
if(a.equals(b)){
}
返回true或false
equals()方法

      String的equals()方法用于比较两个字符串是否相等。由于字符串是对象类型,所以不能简单的用“==”(双等号)判断两个字符串是否相等,而使用equals()方法比较两个对象的内容。

      语法:

      boolean equals(String str)
      str:要作比较的字符串对象。
      返回:如果和String相等则为true;否则为false。
      例如字符串“abc”和一个新的字符串“abc”比较的结果为“true”,因为它们内容相同。
equals()方法比较的是对象的内容(区分字母的大小写格式),但是如果使用“==”双等号操作符比较两个对象时,比较的是两个对象的内存地址,所以它们不相等(即使内容相同,不同对象的内存地址也是不相同的)。
楼主到底比较内存地址还是内容。
c的内存地址一定不会和“ab”一样的。
回复 使用道具 举报
本帖最后由 JavaUtil 于 2013-4-17 15:24 编辑

字符串处理比较特殊,如果你是new对象的的形势传值(String a=new String("a")),
他会先为变量a分配一块内存空间,然后传给你右面的内存地址;
如果你是用引号传值(String a="a"),他会先把“a”放在一个字符串池中保存,方便以后调用,然后再负值给你。
所以在你的程序中操作变量a和操作字符串a的本质是不同的(虽然显示字符串效果相同),得到的答案也就不同了。
一般字符串的比较都用它的equals方法,因为前辈们帮我们解决了这些问题。
回复 使用道具 举报
因为
String d = "a" + "b" = “ab”;
运行之后,把ab存入到常量池里面,以后出现相同的字符串就调用。
和对象"ab"比较的时候,这里就会调用常量池里面的“ab”,所以返回是true;

String c = a+b;  
c后面的字符串不能在编译时期就确定下来。
不能引用常量池里面的字符串。
和“ab”比较的时候  一个在栈内存,一个常量池中,地址不一样,所以返还false。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马