equals和==的区别

来源:互联网 发布:厂区网络监控设计方案 编辑:程序博客网 时间:2024/06/03 21:23
equals和==的区别
    博客分类:
  • Java学习笔记
equals==值传递引用传递

        这两天一直在看数据结构和算法,看到一些内容就想起了龙哥曾经讲过的“equals”和“==”的区别,于是重新回顾梳理了一遍,更加深了印象。现在做一下比较:

要辨别“equals”和“==”,首先必须明白两个概念“值传递”和“引用传递”。

简单来说,“值传递”就是当你创建一个对象的时候(注意啊:int一个整型也是创建对象),JVM在内存中给你的这个对象开辟了一块地址;“引用传递”就是不重新分配内存资源,只是把你新声明(注意是声明啊,并没有实例化一个对象)的对象指向了一个已经在内存中有的对象,即两个对象名同指一处地址,当然我更改这个对象的值后,两个对象名所指向的这个对象的值都变了。

(ps:这个地方被大神指出有误,部分地方博主进行了更改,划掉的区域是被指出有误的地方,为避免难以看懂评论,特作此处理。博主另写了一篇博文对内存分配中的"栈"与"堆"进行了分析)

这里还要强调一下“new”,这是实例化对象的标识,也就是在内存中重新分配空间的标识。(关键字new为每个对象申请内存空间,除基本类型,且所有的对象都在堆heap中分配空间)我们通常用的时候,例如比较字符串,“equals”比较的是这两个字符串的值是不是一样,而“==”则比较的是这两个字符串的引用地址是否一样。例如下面的代码示例:

字符串中“equals”和“==”对比示例代码 复制代码 收藏代码
  1. /** 
  2. * 字符串中“equals”和“==”对比示例  
  3. * @author 赵广超 
  4. */ 
  5. public class equalsTest { 
  6.     public static void main(String[] args) { 
  7.  
  8.         String aaa =new String("abc"); 
  9.         String bbb =new String("abc"); 
  10.         String ccc ="abc"; 
  11.         String ddd=aaa; 
  12.          
  13.         if(aaa == bbb){ 
  14.             System.out.println("aaa == bbb"); 
  15.         }else{ 
  16.             System.out.println("aaa  != bbb"); 
  17.         } 
  18.         if(aaa.equals(bbb)){ 
  19.             System.out.println("aaa equals bbb "); 
  20.         }else{ 
  21.             System.out.println("aaa not equals bbb "); 
  22.         } 
  23.         if(aaa == ccc){ 
  24.             System.out.println("aaa == ccc"); 
  25.         }else{ 
  26.             System.out.println("aaa  != ccc"); 
  27.         } 
  28.         if(aaa.equals(ccc)){ 
  29.             System.out.println("aaa equals ccc "); 
  30.         }else{ 
  31.             System.out.println("aaa not equals ccc "); 
  32.         } 
  33.         if(bbb == ccc){ 
  34.             System.out.println("bbb == ccc"); 
  35.         }else{ 
  36.             System.out.println("bbb  != ccc"); 
  37.         } 
  38.         if(bbb.equals(ccc)){ 
  39.             System.out.println("bbb equals ccc "); 
  40.         }else{ 
  41.             System.out.println("bbb not equals ccc "); 
  42.         } 
  43.         if(aaa == ddd){ 
  44.             System.out.println("aaa == ddd"); 
  45.         }else{ 
  46.             System.out.println("aaa  != ddd"); 
  47.         } 
  48.         if(aaa.equals(ddd)){ 
  49.             System.out.println("aaa equals ddd "); 
  50.         }else{ 
  51.             System.out.println("aaa not equals ddd "); 
  52.         } 
  53.         if(bbb == ddd){ 
  54.             System.out.println("bbb == ddd"); 
  55.         }else{ 
  56.             System.out.println("bbb  != ddd"); 
  57.         } 
  58.         if(bbb.equals(ddd)){ 
  59.             System.out.println("bbb equals ddd "); 
  60.         }else{ 
  61.             System.out.println("bbb not equals ddd "); 
  62.         } 
  63.         if(ccc == ddd){ 
  64.             System.out.println("ccc == ddd"); 
  65.         }else{ 
  66.             System.out.println("ccc  != ddd"); 
  67.         } 
  68.         if(ccc.equals(ddd)){ 
  69.             System.out.println("ccc equals ddd "); 
  70.         }else{ 
  71.             System.out.println("ccc not equals ddd "); 
  72.         } 
  73.     } 
/** * 字符串中“equals”和“==”对比示例  * @author 赵广超 */public class equalsTest {public static void main(String[] args) {String aaa =new String("abc");String bbb =new String("abc");String ccc ="abc";String ddd=aaa;if(aaa == bbb){System.out.println("aaa == bbb");}else{System.out.println("aaa  != bbb");}if(aaa.equals(bbb)){System.out.println("aaa equals bbb ");}else{System.out.println("aaa not equals bbb ");}if(aaa == ccc){System.out.println("aaa == ccc");}else{System.out.println("aaa  != ccc");}if(aaa.equals(ccc)){System.out.println("aaa equals ccc ");}else{System.out.println("aaa not equals ccc ");}if(bbb == ccc){System.out.println("bbb == ccc");}else{System.out.println("bbb  != ccc");}if(bbb.equals(ccc)){System.out.println("bbb equals ccc ");}else{System.out.println("bbb not equals ccc ");}if(aaa == ddd){System.out.println("aaa == ddd");}else{System.out.println("aaa  != ddd");}if(aaa.equals(ddd)){System.out.println("aaa equals ddd ");}else{System.out.println("aaa not equals ddd ");}if(bbb == ddd){System.out.println("bbb == ddd");}else{System.out.println("bbb  != ddd");}if(bbb.equals(ddd)){System.out.println("bbb equals ddd ");}else{System.out.println("bbb not equals ddd ");}if(ccc == ddd){System.out.println("ccc == ddd");}else{System.out.println("ccc  != ddd");}if(ccc.equals(ddd)){System.out.println("ccc equals ddd ");}else{System.out.println("ccc not equals ddd ");}}}

结果如下:

        aaa  != bbb

        aaa equals bbb

        aaa  != ccc

        aaa equals ccc

        bbb  != ccc

        bbb equals ccc

        aaa == ddd

        aaa equals ddd

        bbb  != ddd

        bbb equals ddd

        ccc  != ddd

        ccc equals ddd

对上面的结果我们可以做如下解释:

String aaa =new String("abc");

        String bbb =new String("abc");

        String ccc ="abc";

        String ddd=aaa;

       左边的代码在内存中分配的结果如右边所示:故有控制台的打印信息 即“equals“比较的是两个值是不是一样,而”==“比较的是内存地址是不是相同。

    可是,实际的并不总是这样的。String类中的Equals这个方法重写了超类Object(Object类被所有的其他类继承)中的equals方法。而Object超类中有如下代码:

Object超类中的equals()方法代码 复制代码 收藏代码
  1. public boolean equals(Object obj) { 
  2.     return (this == obj); 
  3.     } 
public boolean equals(Object obj) {return (this == obj);    }

就是说,超类中的equals和==是一码子事,比较的都是内存地址。

在String类中,重写的equals方法代码如下:

String类中的equals()方法代码 复制代码 收藏代码
  1. public boolean equals(Object anObject) { 
  2. if (this == anObject) { 
  3.     return true; 
  4. if (anObject instanceof String) { 
  5.     String anotherString = (String)anObject; 
  6.     int n = count; 
  7.     if (n == anotherString.count) { 
  8.     char v1[] = value; 
  9.     char v2[] = anotherString.value; 
  10.     int i = offset; 
  11.     int j = anotherString.offset; 
  12.     while (n-- != 0) { 
  13.         if (v1[i++] != v2[j++]) 
  14.         return false; 
  15.     } 
  16.     return true; 
  17.     } 
  18. return false; 
  19.    } 
 public boolean equals(Object anObject) {if (this == anObject) {    return true;}if (anObject instanceof String) {    String anotherString = (String)anObject;    int n = count;    if (n == anotherString.count) {char v1[] = value;char v2[] = anotherString.value;int i = offset;int j = anotherString.offset;while (n-- != 0) {    if (v1[i++] != v2[j++])return false;}return true;    }}return false;    }

  可见,在不同的类中,引用equals方法时,可能会有不一样的效果。这就提醒我们在编写自己的类时,如果要比较的话,要注意重写Object类中的equals方法。