比较 EQUALS() 和 ==

来源:互联网 发布:分期购物商城源码 编辑:程序博客网 时间:2024/05/18 13:26

1.比较方式角度:
== 是面向过程的操作符;equals是面向对象的操作符
== 不属于任何类,equals则是任何类(在Java中)的一个方法;

我们可以 1)Primitive1 (基本类型) == Primitive2(基本类型);
         2)Object Reference1(对象引用) == Object Reference2(对象引用)
         3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))
这三种比较,但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));
对于基本类型,没有面向对象中发送消息一说,自然也不会有方法成员。
 
2.比较目的角度:
1)如果要比较两个基本类型是否相等,请用 ==;
2)如果要比较两个对象引用是否相等,请用 ==;
3)如果要比较两个对象(逻辑上)是否一致,请用equals;

 

3.对两个对象(逻辑上)是否一致的阐释:
    有人会问:在C++中, 比较两个对象相等不是也可以用 == 吗?我知道您是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是“+”,“+=”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由 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;
}

 

4.equals() 与 ==:
比較物件內容 比較是否同一物件
 equals()        ==
===================================
String str1 = new String(“abc”);
String str2 = new String(“abc”);
String str3 = str1;
String str4 = “abc”;
String str5 = “abc”;
=======================================================
                    str1 / str2     str1 / str3     str4 / str5     str1 / str4
Equals              true              true              true              true
==                    false             true              true              false
=======================================================
 
String str = "abc" 跟 String str = new String("abc")再做”==”得到的結果不同。
long i = 1;
double j = 1;
// i == j 為true。(因為primitive data type,值相等即為true)
Long a = new Long(3L);
Long b = new Long(3L);
Double x = new Double(3.0);
//a == b為false(因為reference type,非同一個物件了)。
//a == x為compile err(因a與x無繼承關係無法convertible)
==的左右兩邊若為不相容的型別轉換,則會發生compiler errors,但若是equals,當物件不相同時 equal()會回傳false,不會造成編譯錯誤(equals Float object and Double object will always return false)。
compares(equals) a Float object and a Double object which will always return false。
每個java class都有一個”equals()”method,這個method是使用”==”來比較兩個reference var所存的值(即是否指向一物件)若要比較content是否相同,必須override equals() method,同時也必須override定義於Object class的”hashcode()”method,否則java collection API操作這個class的object時會錯。
String、Date、File及8個wrapper classes都已override equals() method。
如果hashCode值相同,那object”可能”相同(equal);如果hashCode值不相同,那object”一定”不相同。

原创粉丝点击