摘要:在應(yīng)用程序的一次執(zhí)行到另外一次執(zhí)行,同一對象的返回的哈希碼無須保持一致。則是以對象的哈希碼為實參,以進制無符號整數(shù)形式返回此哈希碼的字符串表示形式。
JDK源碼之Object類
1 private static native void registerNatives();
Java中,用native關(guān)鍵字修飾的函數(shù)表明該方法的實現(xiàn)并不是在Java中去完成,而是由C++去完成,并被編譯成了.dll,由Java去調(diào)用。方法的具體實現(xiàn)體在dll文件中,對于像Window,Linux,Mac不同平臺,其具體實現(xiàn)有所不同,主要作用是將C++的方法映射到Java中,實現(xiàn)方法命名的解藕。
2 public final native Class> getClass();
clone()方法又是一個被聲明為native的方法,因此,我們知道了clone()方法并不是Java的原生方法,具體的實現(xiàn)是有C++完成的,其目的是創(chuàng)建并返回此對象的一個副本,在List集合中,會經(jīng)常用到,比如說,list集合擴容。
3 public final native Class> getClass();
在Java中,每一個類都有相同的特征和行為的實例的抽象并進行描述,例如,都具有類的名稱,由類加載器去加載,
都有包,父類的屬性和方法,Java中有專門定義的一個類,class,可以通過getClass方法,就可以獲取類的所有特征,在Java的反射技術(shù)中,大量使用這個方法。
4 public boolean equals(Object obj);
在此方法中,返回的結(jié)果是this == obj ,可知,Object的原生的equals()方法調(diào)用的正是==,與==具有相同的含義。在object類中,此標(biāo)尺即為==。當(dāng)然,這個標(biāo)尺不是固定的,其他類中可以按照實際的需要對此標(biāo)尺含義進行重定義。如String類中則是依據(jù)字符串內(nèi)容是否相等來重定義了此標(biāo)尺含義。如此可以增加類的功能型和實際編碼的靈活性。當(dāng)然了,如果自定義的類沒有重寫equals()方法來重新定義此標(biāo)尺,那么默認的將是其父equals(),直到object基類。
5 public native int hashCode();
hashCode()方法返回一個整形數(shù)值,表示該對象的哈希碼值。在Java應(yīng)用程序程序執(zhí)行期間,對于同一對象多次調(diào)用hashCode()方法時,其返回的哈希碼是相同的,前提是將對象進行equals比較時所用的標(biāo)尺信息未做修改。在Java應(yīng)用程序的一次執(zhí)行到另外一次執(zhí)行,同一對象的hashCode()返回的哈希碼無須保持一致。如果兩個對象相等(依據(jù):調(diào)用equals()方法),那么這兩個對象調(diào)用hashCode()返回的哈希碼也必須相等;反之,兩個對象調(diào)用hasCode()返回的哈希碼相等,這兩個對象不一定相等。以集合類中,以Set為例,當(dāng)新加一個對象時,需要判斷現(xiàn)有集合中是否已經(jīng)存在與此對象相等的對象,如果沒有hashCode()方法,需要將Set進行一次遍歷,并逐一用equals()方法判斷兩個對象是否相等,此種算法時間復(fù)雜度為o(n)。通過借助于hasCode方法,先計算出即將新加入對象的哈希碼,然后根據(jù)哈希算法計算出此對象的位置,直接判斷此位置上是否已有對象即可。
6 public String toString();
getClass()返回對象的類對象,getClassName()以String形式返回類對象的名稱(含包名)。
Integer.toHexString(hashCode())則是以對象的哈希碼為實參,以16進制無符號整數(shù)形式返回此哈希碼的字符串表示形式。例如調(diào)用toString,就會返回以包名類名和16進制連接的名字。
7 public final native void notify();
喚醒所有在這個對象的監(jiān)視器上等待的線程,線程通過調(diào)用一個對象來監(jiān)視對象的監(jiān)視器。在當(dāng)前線程放棄對該對象的鎖定之前,喚醒線程將無法繼續(xù)進行。被喚醒的線程將以通常的方式與可能在此對象上積極競爭同步的任何其他線程競爭;例如,被喚醒的線程在成為下一個鎖定此對象的線程時沒有可靠的特權(quán)或缺點。
8 public final native void notifyAll();
同 notify ,其所在線程不會立即釋放所持有的鎖,直到其所在同步代碼塊中的代碼執(zhí)行完畢,此時釋放鎖,因此,如果其同步代碼塊后還有代碼,其執(zhí)行則依賴于JVM的線程調(diào)度
9 public final native void wait(long timeout) throws InterruptedException;
wait(...)方法調(diào)用后當(dāng)前線程將立即阻塞,且適當(dāng)其所持有的同步代碼塊中的鎖,直到被喚醒或超時或打斷后且重新獲取到鎖后才能繼續(xù)執(zhí)行;
10 protected void finalize() throws Throwable { }
Object中定義finalize方法表明Java中每一個對象都將具有finalize這種行為,其具體調(diào)用時機在:JVM準(zhǔn)備對此對形象所占用的內(nèi)存空間進行垃圾回收前,將被調(diào)用。由此可以看出,此方法并不是由我們主動去調(diào)用的(雖然可以主動去調(diào)用,此時與其他自定義方法無異)
11 為什么所有的類的父類都是Object類,而有些源碼并沒有繼承Object
在編譯源代碼時,當(dāng)遇到?jīng)]有父類的類時,編譯器會將其指定一個默認的父類(一般為Object),而虛擬機在處理到這個類時,由于這個類已經(jīng)有一個默認的父類了,因此,VM仍然會按著常規(guī)的方法來處理每一個類。對于這種情況,從編譯后的二進制角度來看,所有的類都會有一個父類。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77315.html
摘要:接口解釋這個序列化接口沒有任何方法和域,僅用于標(biāo)識序列化的語意。用于對兩個實例化對象比較大小這個接口是一個只讀的字符序列。的序列化機制是通過在運行時判斷類的來驗證版本一致性的。然后從開始再對每一個字符進行判斷是不是所要替換的字符。 1 接口解釋 (1)Serializable 這個序列化接口沒有任何方法和域,僅用于標(biāo)識序列化的語意。 (2)Comparable 用于對兩個實例化對象...
摘要:問題的特性的實現(xiàn)原理是否可重入是否是公平鎖的優(yōu)化的五種使用方式簡介關(guān)鍵字是里面最基本的同步手段,它經(jīng)過編譯之后,會在同步塊的前后分別生成和字節(jié)碼指令,這兩個字節(jié)碼指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現(xiàn)原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...
摘要:問題的特性的實現(xiàn)原理是否可重入是否是公平鎖的優(yōu)化的五種使用方式簡介關(guān)鍵字是里面最基本的同步手段,它經(jīng)過編譯之后,會在同步塊的前后分別生成和字節(jié)碼指令,這兩個字節(jié)碼指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現(xiàn)原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...
摘要:問題的特性的實現(xiàn)原理是否可重入是否是公平鎖的優(yōu)化的五種使用方式簡介關(guān)鍵字是里面最基本的同步手段,它經(jīng)過編譯之后,會在同步塊的前后分別生成和字節(jié)碼指令,這兩個字節(jié)碼指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現(xiàn)原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...
閱讀 2760·2021-09-24 09:47
閱讀 4380·2021-08-27 13:10
閱讀 3031·2019-08-30 15:44
閱讀 1300·2019-08-29 12:56
閱讀 2601·2019-08-28 18:07
閱讀 2625·2019-08-26 14:05
閱讀 2584·2019-08-26 13:41
閱讀 1275·2019-08-26 13:33