- ==即可以比较基本类型也可以比较引用类型,对于基本类型比较值的大小,对于引用数据类型比较内存地址。
- equals的话,它是属于java.lang.object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到string等类的equals方法时被重写过的,而且String类在日常开发中用到的比较多,久而久之就形成了equals是比较值的错误观点。
- 具体要看自定义类里面有没有重写object类的equals方法来判断。
- 通常情况下,重写equals方法,会比较类中的相应数据是否都相等。
package com.advan.equal;
public class EqualsTest {
public static void main(String[] args) {
// 首先复习一下 ==
int i = 10;
int j = 10;
System.out.println(i == j); //true
double d = 10.0;
System.out.println(i == d); //true 整型与浮点型运算会发生类型提升
char c = 10;
System.out.println(i == c); //true 字符串与整型比较会转换为整型
char c1 = 65;
char c2 = 'A';
System.out.println(c1 == c2); //true 同理
// equals() 方法的使用
Customer cust1 = new Customer("Tom",10);
Customer cust2 = new Customer("Tom",10);
System.out.println(cust1 == cust2);
System.out.println(cust1.equals(cust2));
/**
* 既然说equlas也是比较值的,为什么返回的是false呢?
* public boolean equals(Object obj) {
* return (this == obj);
* }
* equals的源码如上,发现equals的底层依旧是 ==
* 重写之后的返回值为true了
*/
String s1 = new String("123456");
String s2 = new String("123456");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
// 源码如下:
// 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类型,Date和File类型的equals方法也是如此。
}
}
class Customer{
String name;
int age;
public Customer(String name,int age){
this.name = name;
this.age = age;
}
// 在我们定义的类里面重写一下equals方法。
@Override // 表示重写
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof Customer) {
Customer ancust = (Customer)anObject;
return this.name.equals(ancust.name) && this.age == ancust.age;
}
return false;
}
}
原则:
对称性:x.equals(y) == true ; y.equals(x) == true
自反性:x.equals(x) == true
传递性:x.equals(y) == true ; y.equals(z) == true ; x.equals(z) 一定为true
一致性:如果x.equals(y) == true,只要x和y的值没有发生改变,x.equals(y)一直为true
通用性:任何情况下 x.equals(null)永远返回false
总结:
== 可以用于比较基础数据类型与引用数据类型,前者比较值的大小,后者比较引用地址是否一致。
Object类中的equals的底层是 ==。
String类中重写的equals比较的不是引用地址,而是比较实体内容是否一致。
Date类和File类也一样。