java源碼閱讀之java.lang.Object
Object是所有類的父類,任何類都默認(rèn)繼承Object。Object類到底實(shí)現(xiàn)了哪些方法?
1.clone方法
保護(hù)方法,實(shí)現(xiàn)對(duì)象的淺復(fù)制,只有實(shí)現(xiàn)了Cloneable接口才可以調(diào)用該方法,否則拋出CloneNotSupportedException異常。
2.getClass方法
final方法,獲得運(yùn)行時(shí)類型。
3.toString方法
該方法用得比較多,一般子類都有覆蓋。
4.finalize方法
該方法用于釋放資源。因?yàn)闊o(wú)法確定該方法什么時(shí)候被調(diào)用,很少使用。
5.equals方法
該方法是非常重要的一個(gè)方法。一般equals和==是不一樣的,但是在Object中兩者是一樣的。子類一般都要重寫(xiě)這個(gè)方法。
6.hashCode方法
該方法用于哈希查找,重寫(xiě)了equals方法一般都要重寫(xiě)hashCode方法。這個(gè)方法在一些具有哈希功能的Collection中用到。
一般必須滿足obj1.equals(obj2)==true??梢酝瞥鰋bj1.hash-Code()==obj2.hashCode(),但是hashCode相等不一定就滿足equals。不過(guò)為了提高效率,應(yīng)該盡量使上面兩個(gè)條件接近等價(jià)。
7.wait方法
wait方法就是使當(dāng)前線程等待該對(duì)象的鎖,當(dāng)前線程必須是該對(duì)象的擁有者,也就是具有該對(duì)象的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(longtimeout)設(shè)定一個(gè)超時(shí)間隔,如果在規(guī)定時(shí)間內(nèi)沒(méi)有獲得鎖就返回。
調(diào)用該方法后當(dāng)前線程進(jìn)入睡眠狀態(tài),直到以下事件發(fā)生。
(1)其他線程調(diào)用了該對(duì)象的notify方法。
(2)其他線程調(diào)用了該對(duì)象的notifyAll方法。
(3)其他線程調(diào)用了interrupt中斷該線程。
(4)時(shí)間間隔到了。
此時(shí)該線程就可以被調(diào)度了,如果是被中斷的話就拋出一個(gè)InterruptedException異常。
8.notify方法
該方法喚醒在該對(duì)象上等待的某個(gè)線程。
9.notifyAll方法
該方法喚醒在該對(duì)象上等待的所有線程。
—Object—
ClassObjectistherootoftheclasshierarchy.EveryclasshasObjectasasuperclass.Allobjects,includingarrays,implementthemethodsofthisclass.——FromOracle
—釋義—
Object類是java中所有對(duì)象所繼承的父類,即便是數(shù)組也繼承了該父類(可以理解為原始類,所有類的祖先,你也許會(huì)想問(wèn):詹姆斯第一個(gè)寫(xiě)的類是不是Object?)。
所有類對(duì)Object類的繼承都是隱式繼承,所以無(wú)法看到。
—Object—
默認(rèn)構(gòu)造方法
—clone—
—equals—
Indicateswhethersomeotherobjectis"equalto"thisone.
Theequalsmethodimplementsanequivalencerelationonnon-nullobjectreferences:—FromORacle—
原始類Object的equals比較的是兩個(gè)變量的非空對(duì)象的引用。
源碼:
public boolean equals(Object obj) { return (this == obj); }
通過(guò)源碼我們看到,原始類equals其實(shí)與“==”是等價(jià)的。
—finalize—
—getClass—
—hashcode—
IntheJavaprogramminglanguage,everyclassimplicitlyorexplicitlyprovidesahashCode()method,whichdigeststhedatastoredinaninstanceoftheclassintoasinglehashvalue(a32-bitsignedinteger).Thishashisusedbyothercodewhenstoringormanipulatingtheinstance–thevaluesareintendedtobeevenlydistributedforvariedinputsforuseinclustering.Thispropertyisimportanttotheperformanceofhashtablesandotherdatastructuresthatstoreobjectsingroups("buckets")basedontheircomputedhashvalues.Technically,inJava,hashCode()bydefaultisanativemethod,meaning,ithasthemodifier'native',asitisimplementeddirectlyinthenativecodeintheJVM.
Source:Wikipedia
java中每個(gè)類都隱式或者顯式的實(shí)現(xiàn)了Object的hashcode方法。
跟谷歌和官方個(gè)人總結(jié),作者為什么要在原始類中存在hashcode呢?
①、類對(duì)象的存儲(chǔ)優(yōu)化,便于查找類對(duì)象。
②、配合equals使用。
注意:很多博客表示hashcode方法返回的是該類的物理存儲(chǔ)地址或者是邏輯存儲(chǔ)地址,這個(gè)說(shuō)法是錯(cuò)誤的,按照官方的說(shuō)法:返回的32位值只是與類對(duì)象的存儲(chǔ)位置有關(guān)。
—notify—
—notifyall—
—toString—
ThetoStringmethodforclassObjectreturnsastringconsistingofthenameoftheclassofwhichtheobjectisaninstance,theat-signcharacter`@',andtheunsignedhexadecimalrepresentationofthehashcodeoftheobject.Inotherwords,thismethodreturnsastringequaltothevalueof:
getClass().getName()+'@'+Integer.toHexString(hashCode())
源碼:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
返回一個(gè)格式為類名+@+該類的hash值。
—wait—
finalize()
總結(jié)
以上就是本文關(guān)于java源碼閱讀之java.lang.Object的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Java開(kāi)發(fā)崗位面試被問(wèn)到泛型怎么辦
泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計(jì)模式中有非常廣泛的應(yīng)用。java泛型知識(shí)點(diǎn)也是Java開(kāi)發(fā)崗位必問(wèn)的一個(gè)話題,今天小編就給大家普及下Java泛型常見(jiàn)面試題,感興趣的朋友一起看看吧2021-07-07java實(shí)現(xiàn)輕量型http代理服務(wù)器示例
這篇文章主要介紹了java實(shí)現(xiàn)輕量型http代理服務(wù)器示例,需要的朋友可以參考下2014-04-04基于mybatis-plus-generator實(shí)現(xiàn)代碼自動(dòng)生成器
這篇文章專門(mén)為小白準(zhǔn)備了入門(mén)級(jí)mybatis-plus-generator代碼自動(dòng)生成器,可以提高開(kāi)發(fā)效率。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05SpringBoot項(xiàng)目中引入本地JAR包配置的幾種方法
SpringBoot有時(shí)需要引入本地JAR包以便重用已有的代碼庫(kù)或者第三方庫(kù),本文主要介紹了SpringBoot項(xiàng)目中引入本地JAR包配置的幾種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08Springboot與Maven多環(huán)境配置的解決方案
多環(huán)境配置的解決方案有很多,我看到不少項(xiàng)目的多環(huán)境配置都是使用Maven來(lái)實(shí)現(xiàn)的,本文就實(shí)現(xiàn)Springboot與Maven多環(huán)境配置,感興趣的可以了解下2021-06-06spring根據(jù)controller中接收請(qǐng)求參數(shù)不同走不同service的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于spring實(shí)現(xiàn)根據(jù)controller中接收請(qǐng)求參數(shù)不同走不同service的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2018-11-11修改idea運(yùn)行內(nèi)存大小的方法總結(jié)
在開(kāi)發(fā)過(guò)程中,總會(huì)遇到idea運(yùn)行內(nèi)存不足,所以本文小編給大家介紹了修改idea運(yùn)行內(nèi)存大小的兩種方法,文中通過(guò)圖文給大家講解的非常詳細(xì),需要的朋友可以參考下2023-12-12詳解java如何實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為yaml
這篇文章主要為大家詳細(xì)介紹了java如何利用snakeyaml和freemarker實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為yaml文件,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2023-11-11java實(shí)現(xiàn)波雷費(fèi)密碼算法示例代碼
這篇文章主要介紹了java實(shí)現(xiàn)波雷費(fèi)密碼算法示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01