Object
通用方法
/**
* native 方法,用于返回當(dāng)前運行時對象的 Class 對象,使用了 final 關(guān)鍵字修飾,故不允許子類重寫。
*/
public final native Class<?> getClass()
/**
* native 方法,用于返回對象的哈希碼,主要使用在哈希表中,比如 JDK 中的HashMap。
*/
public native int hashCode()
/**
* 用于比較 2 個對象的內(nèi)存地址是否相等,String 類對該方法進(jìn)行了重寫以用于比較字符串的值是否相等。
*/
public boolean equals(Object obj)
/**
* naitive 方法,用于創(chuàng)建并返回當(dāng)前對象的一份拷貝。
*/
protected native Object clone() throws CloneNotSupportedException
/**
* 返回類的名字實例的哈希碼的 16 進(jìn)制的字符串。建議 Object 所有的子類都重寫這個方法。
*/
public String toString()
/**
* native 方法,并且不能重寫。喚醒一個在此對象監(jiān)視器上等待的線程(監(jiān)視器相當(dāng)于就是鎖的概念)。如果有多個線程在等待只會任意喚醒一個。
*/
public final native void notify()
/**
* native 方法,并且不能重寫。跟 notify 一樣,唯一的區(qū)別就是會喚醒在此對象監(jiān)視器上等待的所有線程,而不是一個線程。
*/
public final native void notifyAll()
/**
* native方法,并且不能重寫。暫停線程的執(zhí)行。注意:sleep 方法沒有釋放鎖,而 wait 方法釋放了鎖 ,timeout 是等待時間。
*/
public final native void wait(long timeout) throws InterruptedException
/**
* 多了 nanos 參數(shù),這個參數(shù)表示額外時間(以毫微秒為單位,范圍是 0-999999)。 所以超時的時間還需要加上 nanos 毫秒。。
*/
public final void wait(long timeout, int nanos) throws InterruptedException
/**
* 跟之前的2個wait方法一樣,只不過該方法一直等待,沒有超時時間這個概念
*/
public final void wait() throws InterruptedException
/**
* 實例被垃圾回收器回收的時候觸發(fā)的操作
*/
protected void finalize() throws Throwable { }
==和equals()詳解
==
== 對于基本類型和引用類型的作用效果是不同的:
對于基本數(shù)據(jù)類型來說,== 比較的是值。
對于引用數(shù)據(jù)類型來說,== 比較的是對象的內(nèi)存地址。
equals()
未重寫:通過equals()比較該類的兩個對象時,等價于通過“==”比較這兩個對象,使用的默認(rèn)是 Object類equals()方法。
重寫::一般我們都重寫 equals()方法來比較兩個對象中的屬性是否相等;若它們的屬性相等,則返回 true(即,認(rèn)為這兩個對象相等)。
hashCode()
hashCode() 的作用是獲取哈希碼(int 整數(shù)),也稱為散列碼。這個哈希碼的作用是確定該對象在哈希表中的索引位置。
hashCode()定義在 JDK 的 Object 類中,這就意味著 Java 中的任何類都包含有 hashCode() 函數(shù)。另外需要注意的是: Object 的 hashCode() 方法是本地方法,也就是用 C 語言或 C++ 實現(xiàn)的,該方法通常用來將對象的內(nèi)存地址轉(zhuǎn)換為整數(shù)之后返回。
hashcode()和equals()愛恨交織
基本概念:
hashCode() 和 equals()都是用于比較兩個對象是否相等。
提供兩種方法的意義:
在一些容器(比如 HashMap、HashSet)中,有了 hashCode() 之后,判斷元素是否在對應(yīng)容器中的效率會更高(參考添加元素進(jìn)HashSet的過程)!如果 HashSet 在對比的時候,同樣的 hashCode 有多個對象,它會繼續(xù)使用 equals() 來判斷是否真的相同。也就是說 hashCode 幫助我們大大縮小了查找成本。
兩者缺少時的情況:
兩者判斷為true/false的情況:
- 如果兩個對象的
hashCode值相等,那這兩個對象不一定相等(哈希碰撞)。 - 如果兩個對象的
hashCode值相等并且equals()方法也返回true,我們才認(rèn)為這兩個對象相等。 - 如果兩個對象的
hashCode值不相等,我們就可以直接認(rèn)為這兩個對象不相等。