Object簡介
Object類是所有類的父類,即每個類都直接或間接繼承自該類。所以一個Object類型的變數可以引用任何對象,不論是類實例還是數組。
在不明確給出父類的情況下,Java會自動把Object作為要定義類的父類。
Object類有一個默認構造方法public Object(),在構造子類實例時,都會先調用這個默認構造方法。
Object類共13個方法

如圖可知,Object類有12個成員方法,按照用途可以分為以下幾種
構造函數
hashCode和equale函數用來判斷對象是否相同,
wait(),wait(long),wait(long,int),notify(),notifyAll() 多線程場景使用
toString()和getClass, 列印類信息/獲取類信息
clone() 克隆對象
finalize()用於在垃圾回收
常用方法預覽
Object()
默認構造方法
clone()
protected native Object clone() throws CloneNotSupportedException;
創建並返回此對象的一個副本(複製對象),用於實現對象的淺複製,只有實現了Cloneable介面才可以調用該方法,否則拋出
CloneNotSupportedException異常。
主要是JAVA里除了8種基本類型傳參數是值傳遞,其他的類對象傳參數都是引用傳遞,我們有時候不希望在方法里將參數改變,這是就需要在類中重寫clone方法
equals(Object obj)
用於比較兩個對象是否相等,底層用==實現,比較的還是內存地址,子類想要比較兩個對象是否相等需要重寫equals()方法
finalize()
當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法,該方法用於釋放資源。很少使用
Java允許在類中定義一個名為finalize()的方法。它的工作原理是:一旦垃圾回收器準備好釋放對象佔用的存儲空間,將首先調用其finalize()方法。並且在下一次垃圾回收動作發生時,才會真正回收對象佔用的內存。
getClass()
返回一個對象的運行時類,獲得類型的信息。返回一個Class對象,經常用於java反射機制
hashcode()
該方法將對象的內存地址進行哈希運算,返回一個int類型的哈希值(返回該對象的哈希碼值)。
功能:是相等對象擁有相同的哈希碼,盡量讓不等的對象具有不同的哈希碼。該方法用於哈希查找,可以減少在查找中使用equals的次數,重寫了equals方法一般都要重寫hashCode方法。這個方法在一些具有哈希功能的Collection中用到。
一般必須滿足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(), 但是hashCode相等不一定就滿足equals。不過為了提高效率,應該盡量使上面兩個條件接近等價。
如果不重寫hashcode(),在HashSet中添加兩個equals的對象,會將兩個對象都加入進去。
notify()
該方法喚醒在該對象上等待的某個線程。
notifyAll()
該方法喚醒在該對象上等待的所有線程。
toString()
返回該對象的字元串表示。以便用戶能夠獲得一些有關對象狀態的基本信息。簡單說就是利用字元串來表示對象。不重寫toString()返回的是對象的類路徑 + @ + 內存地址hash後的16進位字元串(如下所示源碼)
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
wait()
導致當前的線程等待,直到其他線程調用此對象的notify()方法或notifyAll()方法。
wait(long timeout)
wait方法就是使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具有該對象的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(long timeout)設定一個超時間隔,如果在規定時間內沒有獲得鎖就返回。
調用該方法後當前線程進入睡眠狀態,直到以下事件發生。
其他線程調用了該對象的notify方法。
其他線程調用了該對象的notifyAll方法。
其他線程調用了interrupt中斷該線程。
時間間隔到了。
此時該線程就可以被調度了,如果是被中斷的話就拋出一個InterruptedException異常。
hash 法簡介
hash 演算法,又被成為散列演算法
基本上,哈希演算法就是將對象本身的鍵值,通過特定的數學函數運算或者使用其他方法,轉化成相應的數據存儲地址的。
而哈希法所使用的數學函數就被稱為 『哈希函數』又可以稱之為散列函數。
如果我們能在數組存放的時候就按一定的規則放入元素,在我們想找某個元素的時候在根據之前定好的規則,就可以很快的得到我們想要的結果了。換句話說之前我們在數組中存放元素的順序可能是依照添加順序進行的,但是如果我們是按照一種既定的數學函數運算得到要放入元素的值,和數組角標的映射關係的話。那麼我們在想取某個值的元素的時候就使用映射關係就可以找到對應的角標了。
在常見的 hash 函數中有一種最簡單的方法交「除留餘數法」,操作方法就是將要存入數據除以某個常數後,使用餘數作為索引值。
下面看個例子:將 323 ,458 ,25 ,340 ,28 ,969, 77 使用「除留餘數法」存儲在長度為11的數組中。我們假設上邊說的某個常數即為數組長度11。 每個數除以11以後存放的位置如下圖所示:

試想一下我們現在想要拿到 77 在數組中的位置,是不是只需要arr[77%11] = 77 就可以了。
但是上述簡單的 hash 演算法,缺點也是很明顯的,比如 77 和 88 對 11 取餘數得到的值都是 0,但是角標為 0 位置已經存放了 77 這個數據,那88就不知道該去哪裡了。上述現象在哈希法中有個名詞叫碰撞:
碰撞:若兩個不同的數據經過相同哈希函數運算後,得到相同的結果,那麼這種現象就做碰撞。
如果兩個對象相同,那麼它們的hashCode值一定要相同;
如果兩個對象的hashCode相同,它們並不一定相同(這裡說的對象相同指的是用equals方法比較)。
equals()相等的兩個對象,hashCode()一定相等;equals()不相等的兩個對象,卻並不能證明他們的hashCode()不相等。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/228178.html
微信掃一掃
支付寶掃一掃