八、== 和 equals的区别

142 阅读2分钟

1.equals是方法, 而 == 是操作符

2.如果变量是基本数据类型,只能用==比较,因为它里边没有equals方法, == 比较的是值, 如果是引用类型,则比较的是两个对象是否指向同一块内存空间(也就是地址值是否相等)

3.equals 是 Object 类提供的方法,每个Java 类都继承自 Object 类,所以每个对象都具有equals这个方法,Object类中定义的equals方法默认情况下是和==是一样的,都是比较的是存放地址, 但通过重写equals方法可以让它不是比较引用而是比较数据内容

4.equals会用 == 比较两个类型在内存中的地址一不一样,如果一样,则直接返回true,如果不一样,则直接往下走,再判断是否为string类型,如果不是,则强转为string类型,再将字符串数组拆分为单个字符,一 一比较,有一个不相同,则返回false,否则返回true

equals分析:

equals 方法没有被重写。如果类没有重写该方法,那么默认使用的就是 Object 类的方法

 public boolean equals(Object obj) {
      return (this == obj);
 }

从源码可以看出,里面使用的就是 == 比较,所以这种情况下比较的就是它们在内存中的存放地址。

equals 方法被重写。以 String 类为例,以下是 String 类中的 equals 方法:

public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String)anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                   return false;
               i++;
           }
           return true;
       }
   }
   return false;
}

从源码可以看出, String 类重写了 equals 方法,当使用 == 比较内存的存放地址不相等时,接下来会比较字符串的内容是否相等,所以 String 类中的 equals 方法会比较两者的字符串内容是否一样。

例子:

    String a = "Mr.Li";
    String b = new String("Mr.Li");
    String c = b;
    System.out.println("a == b:" + a == b);             //false
    System.out.println("b == c:" + b == c);             //true
    System.out.println("a == c:" + a == c);             //false
    System.out.println("a.equals(b):" + a.equals(b));   //true
    System.out.println("b.equals(c):" + b.equals(c));   //true

    打印:
    a == b:false
    b == c:true
    a == c:false
    a.equals(b):true
    b.equals(c):true
    a.equals(c):true

String b 通过 new 的方式已经开辟了新的堆内存,String a = "Mr.Li" 是存放在常量池里的,两者在 Java 内存里存放的位置是不同的,所以 a == b 为 false; 而 equals 方法当两者存放的内存地址不同时,会比较两者的值,两者的值都是 "Mr.Li" ,所以 a.equals(b) 为 true