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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© @ne_pie尒ce 中级黑马   /  2013-11-7 11:04  /  1139 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于字符串与非字符串来说,==与equals有什么区别?

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

5 个回复

倒序浏览
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==比较的是2个对象的地址,而equals比较的是2个对象的内容。
显然,当equals为true时,==不一定为true;

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 FFF 于 2013-11-7 11:36 编辑

一个对象名实际是一个指针
==比较的是两个指针是否指向同一个地址
equals比较的是两个指针指向的地址中的内容

写了一个小例子来帮你理解。先不要运行,看看你是否能做得出来。如果你的答案和运行的结果一样,就已经很好了!
  1.         public static void main(String[] args) {
  2.        String a = "abc";
  3.        String b = "abc";
  4.        String c = new String("abc");
  5.        String d = new String("abc");
  6.        String e = a;
  7.        String f = a+"";
  8.       
  9.        System.out.println("a==b为"+(a==b));
  10.        System.out.println("a.equals(b)为"+a.equals(b));
  11.        System.out.println("a==c为"+(a==c));
  12.        System.out.println("a.equals(c)为"+a.equals(c));
  13.        System.out.println("c==d为"+(c==d));
  14.        System.out.println("c.equals(d)为"+c.equals(d));
  15.        System.out.println("e==a为"+(e==a));
  16.        System.out.println("e.equals为"+e.equals(a));
  17.        System.out.println("a==f为"+(a==f));
  18.        System.out.println("a.equals(f)"+a.equals(f));
  19.        System.out.println("c==f为"+(c==f));
  20.        System.out.println("c.equals(f)为"+c.equals(f));
  21. }
复制代码
就目前来说,字符串与非字符串中比较两个对象的时候==与Equals没有显示的区别。
但是在很多方法中,Equals就有区别,所以有时候不同的方法中就有要求对Equals重载。

评分

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

查看全部评分

回复 使用道具 举报
  1. package java131107;
  2. /*
  3. *
  4. * 对于字符串与非字符串来说,==与equals有什么区别?
  5. *
  6. * */


  7. public class Equals {

  8.        
  9.         public static void main(String[] args) {

  10.                 int ia = 3;
  11.                 int ib = 3;
  12.                 int ic = 5;
  13.                 String s1 = "string";
  14.                 String s2 = "string";
  15.                 String s3 = "String *********";
  16.                 String s4= new String("string");
  17.                 Can ca1 = new Can("Can 1");
  18.                 Can ca2 = new Can("Can 2");
  19.                 Can ca3 = new Can("can1");
  20.                 System.out.println("整数的对比********************");
  21.                 System.out.println("ia==ib " + (ia == ib));    //  true   基本数据类型只比较值
  22.                 System.out.println("ia==ic " + (ia == ic));                // false  相等为真
  23. //  整数无equals法对比 System.out.println("ia equals  ib "+(ia.equals(ib));

  24.                 System.out.println("字符串的对比********************");
  25.                 System.out.println("s1==s2 " + (s1 == s2));         //true      对引用型数据比较地址值  同一个内地址
  26.                 System.out.println("s1==s3 " + (s1 == s3));                //false         不同的地址
  27.                 System.out.println("s1==s4 " + (s1 == s4));                //false          不同的内存地址
  28.                 System.out.println("s1 equals s2 " + s1.equals(s2));         //true     内容相同
  29.                 System.out.println("s1 equals s3 " + s1.equals(s3));        //false                同容不同
  30.                 System.out.println("s1 equals s4 " + s1.equals(s4));        //true     内容不同
  31.                
  32.                
  33.                

  34.                 System.out.println("类对象的对比********************");
  35.                 System.out.println("ca1==ca2 " + (ca1 == ca2));                //false    地址不同
  36.                 System.out.println("ca1 equals ca2 " + ca1.equals(ca2));//false   地址不同

  37.                 System.out.println("ca1==ca2 " + (ca1.equals(ca2)));                //false  地址不同
  38.                 System.out.println("ca1 equals  ca3 " + ca1.equals(ca2));                //false  地址不同

  39.                 ca1 = ca2;// 把 c2的引用给了才c1;
  40.                 System.out.println("ca1==ca2 " + (ca1 == ca2));                        //true  同一个对象,相同
  41.                 System.out.println("ca1 equals   ca2 " + (ca1.equals(ca2)));        //true 同一个对象

  42.         }
  43.        

  44. }


  45. class Can{    //定义一个类
  46.         String s;
  47.         public Can(String classname) {
  48.                 this.s=classname;
  49.                 System.out.println("类ca****"+classname);
  50.         }
  51.         <font size="4">}</font>
复制代码
结论:
==:
       1对于基本数据类型比较的是值的大小,
      2 对于引用数据类型比较的是内存地址
equals()方法:
       1 是一个方法,所以不用于基本数据类型的比较
       2equals()比较的是引用数对象(包括类和数组等)的地址值,但是String类重写了equals()方法,所以比较的是内容
       3对于没有重写equals()方法的类,比较的仍是 地址值




评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
你可以找到你的jdk,从里面找到src.zip,解压保存一下,这个是java的源码,
你看看 java.lang.Object 的equals是怎么实现的,
然后再看看 java.lang.String 的equals是怎么重写的,
你就会豁然开朗了
回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马