初学的小伙伴或许会对java中的equals和**==**有些混淆,不过请耐心看下面这篇文章,或许能帮您解决疑惑呦。
==:(运算符)
1:可以使用在基本数据类型变量和引用数据类型变量中。
2:如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等(不一定类型要相同)。
3:如果比价的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体。
4:== 符号使用时,必须保证符号左右两边的变量类型一致。
Demo:
1 | import java.util.Date; |
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方法:
- 用一个类构造出来的不同内存的两个对象,如果内存中的值相等,我们一般情况下也应该认为这两个对象相等,很明显Object中的equals()无法完成这样的重任,Object中的equals()方法只有在两个对象是同一块内存时,才返回true,这时候我们就有必要重写父类Object中的equals()方法。
- 如果希望不同内存但相同内容的两个对象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
25class 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
}
}