一句话概括:
如果操作两边都是对象句柄,就比较两个句柄是否指向同一个对象。如果两边是基本类型,则比较的就是值。
==不属于任何类,而equals则是任何类(Java中)的一个方法。
equals()是每个对象与生俱来的方法,因为所有类的最终基类就是Object(除去Object本身);而equals()是Object的方法之一。
我们可以这样比较:
1)Primitive1(基本类型)== Primitive2(基本类型)
2)Object1 Reference1(对象引用)== Object1 Reference2(对象引用)
3)Object1 Reference1(对象引用).equals(Object1 Reference2(对象引用))
但是却不能这么比较:
Primitive1(基本类型).equals(Primitive2(基本类型))
然后下面看具体的比较
基本数据类型的值:
int a = 4;
int b = 4;
System.out.println(a==b); //True
对于基本数据类型的值只能用“==”比较运算符进行比较。
引用类型的值的比较
Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1==t2); //Fasle
System.out.println(t1.equals(t2)); //False
两句的结果都是False。
原因:
第一句:用new操作符创建的对象都会在内存中分配一个新的内存地址,所以两个对象的内存地址不同,为fasle.
第二句:必须明确equals到底比较的是对象的什么~~
看一看Object类的equals方法源码:
public boolean equals(Object obj) {
return (this == obj);
}
内部使用的也是==比较的,所以equals和==在对象的比较上是一样。
那equals还有什么用?
每个对象都有自己的内存,但是每个对象也都有自己的一些属性。
比如说,马和牛都有腿,我们希望通过腿的数量来判断马和牛这两个对象是否相同。
这个时候,再使用Object类中的equals方法就不能够满足需求了。就需要通过覆盖equals的方式,建立两个对象比
较相同的具体内容。
实例如下:
//马类
class Horse{
String Type;
int Legs;
//相等的标准,腿的数目相等
public boolean equals(Object o){
if(this.Legs==((Cattle)o).Legs){
return true;
}
return false;
}
public Horse(String Type,int legs){
this.Type=Type;
this.Legs=legs;
}
}
//牛类
class Cattle{
String Type;
int Legs;
//相等的标准,腿的数目相等
public Cattle(String Type,int legs){
this.Type=Type;
this.Legs=legs;
}
public boolean equals(Object o){
if(this.Legs==((Horse)o).Legs){
return true;
}
return false;
}
}
public class EqualsTest{
public static void main(String[] args){
Cattle c = new Cattle("I am the Cattle",4);
Horse h = new Horse("I am the Horse",4);
if(c.equals(h)){
System.out.println(c.Type);
System.out.println(h.Type);
System.out.println("Cattle Equals Horse");
}
}
}
最终的结果:
"I am the Cattle"
"I am the Horse"
"Cattle Equals Horse"
通过上面这个用equals方法将风马牛不相等的事物变得相等,我们可以看出,其实对象是否相等,取决于用户的需
求。我们定义什么样的标准,计算机就会踏踏实实的为我们实现。
所以,在用Java的类描述对象的时候,如果要判断该对象是否相同时,通常都会覆盖equals方法,建立根据该对
象特征进行比较相同的依据。