Q:为什么我的标题 “==” 在前 equals() 在后?
A: 因为equals()方法是直接用“==” "实现" 的 所以我们先聊聊 “==”
“==”判等比较
概念 :“==”是等值比较,即比较的是变量的值
比较过程:
1.首先判断两个比较变量类型是否相同 如果不同返回false
2.如果相同继续判断变量的值是否相同 如果相同返回true ,如果不同返回false
1.基本数据类型,变量的值<数据>
2.引用类型,引用变量的值<对象的地址>
1.基本数据类型的例子
int a = 1;
int b = 1;
int c = 2;
System.out.println(a == b); //结果是 true
System.out.println(a == c); //结果是 false
2.引用类型的例子
自定义一个类
class MyClass{
private int number;
public MyClass(int number){
this.number = number;
}
}
MyClass a = new MyClass(1);
MyClass b = new MyClass(1);
MyClass c = new MyClass(2);
System.out.println(a == b); //结果是 false
System.out.println(a == c); //结果是 false
特殊的引用类型
String a = "1";
String b = "1";
String c = "2";
System.out.println(a == b); //结果是 true
System.out.println(a == c); //结果是 false
由于字符串”1”创建时是在方法区的常量池中开辟的空间,并且下次使用时可以重复使用,即 a,b指向的地址是相同的,所以判等的结果是true
包装类引用类型
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b); //结果是 true
System.out.println(c == d); //结果是 false
Integer包装类型中存在自动装箱的情况,当数据范围在-128~127之间时,创建的对象会在方法区的常量池中开辟空间(可复用),a与b指向常量池同一地址所以判等结果为true。当数据超出-128~127范围就会在堆区中开辟空间,由于c,d指向不同对象所以判等的结果为false,
equals()方法
equals()是Object类的方法 (目的是用来比较对象的数据内容是否一致<前提你要重写它 并实现这个功能>)。其中Integer , String,Date,file 这四个类自己已经重写了该方法所以可以直接用 。[ 没有重写equals()方法的类 ] 的equals()方法
本质就是 "==" 如果你要实现比较数据内容是否一致 就要重写它
Object.equals()方法比较过程 和 "= =" 一样
由于基本数据类型 不是 继承Object的 所以基本数据类型 不能用equals()方法, 可以用 "=="来比较
引用类型的例子
自定义的类<没有重写equals()>
MyClass a = new MyClass(1);
MyClass b = new MyClass(1);
MyClass c = new MyClass(2);
System.out.println(a.equals(b)); //结果是 false
System.out.println(a.equals(c)); //结果是 false
结果和用 “==” 比较的一致 ,因为该类没有重写equals()
该类重写equals()
class MyClass{
private int number;
public MyClass(int number){
this.number = number;
}
@Override
public boolean equals(Object arg0) {
boolean bl = false;
MyClass mc = (MyClass)arg0;
if(this.number == mc.number)
bl = true;
else
bl = false;
return bl;
}
}
MyClass a = new MyClass(1);
MyClass b = new MyClass(1);
MyClass c = new MyClass(2);
System.out.println(a.equals(b)); //结果是 true
System.out.println(a.equals(c)); //结果是 false
会发现 a, b 比较的是number的值了。 因为a ,b的number 都是1 比较结果是 true