一句话概括:
如果操作两边都是对象句柄,就比较两个句柄是否指向同一个对象。如果两边是基本类型,则比较的就是值。
==不属于任何类,而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方法,建立根据该对
象特征进行比较相同的依据。