【轉】Object類的常用方法

TD_fcy發表於2020-11-24

Java語言不同於C++語言,是一種單根繼承結構語言,也就是說,Java中所有的類都有一個共同的祖先。這個祖先就是Object類。

object類的結構

Object類的函式 
如圖可知,Object類有12個成員方法,按照用途可以分為以下幾種 
1,建構函式 
2,hashCode和equale函式用來判斷物件是否相同, 
3,wait(),wait(long),wait(long,int),notify(),notifyAll() 
4,toString()和getClass, 
5,clone() 
6,finalize()用於在垃圾回收

函式說明

clone()

clone()函式的用途是用來另存一個當前存在的物件。

hashCode()和equale()

  • equale()用於確認兩個物件是否相同。
  • hashCode()用於獲取物件的雜湊值,這個值的作用是檢索,具體的作用可以參考這裡
  • 雜湊值相同的物件不一定equale()
  • equale()返回true的兩個物件一定相同。
  • Java中Object類的equals()和hashCode()方法深入解析

    1.equals()

    在初學Java的時候,很多人會說在比較物件的時候,==是比較地址,equals()是比較物件的內容,誰說的?

    看看equals()方法在Object類中的定義:

    public   boolean  equals(Object obj){
         return  ( this   ==  obj);
    }

    這是比較內容麼?明顯是比較指標(地址)麼...

     

    但是為什麼會有equals是比較內容的這種說法呢?

    因為在String、Double等封裝類中,已經重寫(overriding)了Object類的equals()方法,於是有了另一種計算公式,是進行內容的比較。

    比如在String類中:

    複製程式碼

    public   int  hashCode() { 
         int  h  =  hash; 
         if  (h  ==   0 ) { 
             char  val[]  =  value; 
             int  len  =  count; 
             for  ( int  i  =   0 ; i  <  len; i ++ ) { 
                h  =   31 * h  +  val[off ++ ]; 
            } 
            hash  =  h; 
        } 
         return  h; 

    複製程式碼

     

    2.hashCode()

    在Object類中的定義為:

    public   native   int  hashCode();

    是一個本地方法,返回的物件的地址值。

    但是,同樣的思路,在String等封裝類中對此方法進行了重寫。方法呼叫得到一個計算公式得到的 int值

     

    3.兩者的關係

    ①兩個obj,如果equals()相等,hashCode()一定相等

    ②兩個obj,如果hashCode()相等,equals()不一定相等

    原因:從雜湊的角度考慮,不同的物件計算雜湊碼的時候,可能引起衝突,大家一定還記得資料結構中衝突的解決方案吧

     

    但是要這麼設計,用兩個函式,個人的理解是為了比較兩個物件時更高效。

    可以考慮在Java集合中,判斷兩個物件是否相等的規則是:

    第一步,如果hashCode()相等,則檢視第二步,否則不相等;

    第二步,檢視equals()是否相等,如果相等,則兩obj相等,否則還是不相等。

     

    為什麼這樣做?個人的理解是讓適當的函式完成適當的功能,畢竟hashCode()比equals()在某種程度上來得快。

toString()和getClass()

toString()返回一個String物件,用來標識自己 
getClass()返回一個Class物件,如果列印出來會發現結果是如下格式

class package.name.xxx 
  • 1

因為返回的是一個class物件,後面可以跟class類的方法。用的是誰的建構函式,那麼getClass返回的就是誰的型別。 
getClass()經常用於java反射機制

wait(),wait(long),wait(long,int),notify(),notifyAll()

  • 這幾個函式體現的是Java的多執行緒機制
  • 在使用的時候要求在synchronize語句中使用
  • wait()用於讓當前執行緒失去操作許可權,當前執行緒進入等待序列
  • notify()用於隨機通知一個持有物件的鎖的執行緒獲取操作許可權
  • notifyAll()用於通知所有持有物件的鎖的執行緒獲取操作許可權
  • wait(long) 和wait(long,int)用於設定下一次獲取鎖的距離當前釋放鎖的時間間隔

finalize()

這個函式在進行垃圾回收的時候會用到,匿名物件回收之前會呼叫到,具體的例子如圖所示

finalize函式說明

相關文章