初学的小伙伴或许会对java中的equals和**==**有些混淆,不过请耐心看下面这篇文章,或许能帮您解决疑惑呦。

==:(运算符)

1:可以使用在基本数据类型变量和引用数据类型变量中。

2:如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等(不一定类型要相同)。

3:如果比价的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体。

4:== 符号使用时,必须保证符号左右两边的变量类型一致。

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.Date;

public class EqualsTest {
public static void main(String[] args) {


//基本数据类型
int i = 10;
int j = 10;
double d = 10.0;
System.out.println(i == j);//true
System.out.println(i == d);//true

boolean b = true;

// System.out.println(i == b);


char c = 10;
System.out.println(i == c);//true

char c1 = 'A';
char c2 = 65;
System.out.println(c1 == c2);//true

//引用类型:
Customer cust1 = new Customer("Tom",21);
Customer cust2 = new Customer("Tom",21);
System.out.println(cust1 == cust2);//false

String str1 = new String("atguigu");
String str2 = new String("atguigu");
System.out.println(str1 == str2);//false
System.out.println("****************************");
System.out.println(cust1.equals(cust2));//false--->true
System.out.println(str1.equals(str2));//true

Date date1 = new Date(32432525324L);
Date date2 = new Date(32432525324L);
System.out.println(date1.equals(date2));//true

}

}

equels()方法

  • Object类的equals方法:

    • 所有类都从Object类中继承了equals方法:

      • Object类中equals 方法的源代码如下:

        public boolean equals(Object obj) {

        return this == obj;

        }

    • Object中的equals方法是直接判断this和obj本身的值是否相等,即可用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,所谓同一对象就是指是否是内存中同一块存储单元,如果 this 和 obj 指向的是同一块内存对象,即返回true,如果 this 和 obj指向的不是同一块内存,即返回false。我们可以认为当不重写equals方法时,equals与==是相同的。

    注意:即便是内容完全相等的两块不同的内存对象,也会返回false。

    总结:如果是同一块内存,则Object中的equals方法返回true,如果是不同的内存,则返回false。

    何时需要重写equals方法:

    1. 用一个类构造出来的不同内存的两个对象,如果内存中的值相等,我们一般情况下也应该认为这两个对象相等,很明显Object中的equals()无法完成这样的重任,Object中的equals()方法只有在两个对象是同一块内存时,才返回true,这时候我们就有必要重写父类Object中的equals()方法。
    2. 如果希望不同内存但相同内容的两个对象equals时返回true,我们就需要重写父类的equals方法。

    Demo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class A{
    public int i;
    public A(int i){
    this.i = i;
    }
    public boolean equals(Object obj){ //aa1调用equals方法,所以this.i指代。 aa2作为形参赋给obj,所以obj指向子类对象aa2。
    A aa = (A)obj; // 当父类引用本身指向的就是一个子类对象时,才可以把父类引用强制转化为子类引用 (多态)
    if(this.i == aa.i) // if (当前对象的i和obj代表的i相等)
    return true;
    else
    return false;
    }
    }

    public class Equals{
    public static void main(String[] args)
    {
    A aa1 = new A(2);
    A aa2 = new A(2);


    System.out.println( aa1.equals(aa2)); // true
    }

    }