Object類簡介

1 hashCode

hashCode的一般約定為:

  1. 同一個(gè)程序中多次調(diào)用返回相同的值肃弟。不會(huì)為equals方法比較對(duì)象提供信息碍现。
  2. 如果兩個(gè)對(duì)象equals結(jié)果為true,那么hashCode的結(jié)果也相等酝陈。
  3. 如果兩個(gè)對(duì)象equals結(jié)果為false豺型,hashCode結(jié)果可能相等也可能不相等。保證不相等對(duì)象的哈希值不同饼齿,有助于提高哈希表的性能饲漾。

2 equals

用于比較是否和傳入對(duì)象相等。
equals的等價(jià)條件是:

  1. 自反性缕溉。任何非null引用x有考传,x.equals(x)返回true
  2. 對(duì)稱性证鸥。任何非null引用xy有僚楞,x.equals(y)返回ture當(dāng)且僅當(dāng)y.equals(x)也返回`true勤晚。
  3. 傳遞性。任何非null引用x镜硕、yz有运翼,如果x.equals(y)y.equals(z),那么x.equals(z)兴枯。
  4. 一致性。任何非null引用x矩欠、y财剖,如果沒有修改對(duì)象,那么多次調(diào)用x.equals(y)返回的結(jié)果是一致的癌淮。
  5. 任何非null引用躺坟。x.equals(null)false

Object類對(duì)象比較特別乳蓄,x.equals(y)true當(dāng)且僅當(dāng)x == ytrue咪橙。

在重寫equals方法時(shí),需要重寫hashCode方法虚倒。為的是保證hashCode的第1條特性能夠成立美侦。

3 clone

克隆結(jié)果的特性

  1. x.clone != xtrue
  2. x.clone.getClass() == x.getClass()true魂奥,如果拷貝的過程中菠剩,調(diào)用了super.clone(除Object類之外)。
  3. x.clone.equals(x)true耻煤,如果重寫了equals方法具壮。

克隆原理
通常,克隆對(duì)象應(yīng)該獨(dú)立于被克隆對(duì)象哈蝇。為了達(dá)到這樣的目的棺妓,可能需要在返回克隆對(duì)象前,修改克隆對(duì)象的字段炮赦,也就是說:

  1. 可變對(duì)象怜跑。需要將可變對(duì)象的引用替換為拷貝的引用。
  2. 不可變對(duì)象(初等類型或不可變引用)眼五∽彼遥克隆過程中就不需要修改super.clone的結(jié)果,一般來說虛擬機(jī)會(huì)創(chuàng)建新的對(duì)象看幼。如下代碼批旺,super.clone返回的結(jié)構(gòu)已經(jīng)將ab完成了。
public class Main implements Cloneable{
    private int a;
    private String b;
    @Override
    public Main clone() throws CloneNotSupportedException {
       return (Main) super.clone();
    }
}

Object類的clone方法
Object類的clone方法執(zhí)行的特定操作诵姜。

  1. 如果對(duì)象的類沒有實(shí)現(xiàn)接口Cloneable汽煮,那么會(huì)拋出CloneNotSupportedException
  2. 所有數(shù)組被認(rèn)為是默認(rèn)實(shí)現(xiàn)了接口Cloneable,數(shù)組類型T[]clone方法的返回類型是T[]暇赤,其中T是任何引用或初等類型心例。否則,此方法將創(chuàng)建此對(duì)象類的新實(shí)例鞋囊,并使用此對(duì)象相應(yīng)字段的內(nèi)容初始化其所有字段止后;字段的內(nèi)容本身不會(huì)被克隆。由此可見溜腐,此方法執(zhí)行此對(duì)象的“淺拷貝”译株,而不是“深拷貝”操作。

Object類沒有實(shí)現(xiàn)Cloneable接口挺益,所以調(diào)用clone方法會(huì)拋CloneNotSupportedException歉糜。

4 notify

喚醒等待獲取對(duì)象監(jiān)控器(monitor)的一個(gè)線程。如果有多個(gè)線程在等待望众,則被喚醒線程是不確定的匪补。

被喚醒線程不能立即執(zhí)行,而是等到當(dāng)前線程釋放對(duì)象鎖才可以執(zhí)行烂翰。被喚醒的線程需要與任何其他線程競爭夯缺,這其中不乏主動(dòng)基于此對(duì)象同步的線程。

該方法只能由對(duì)象monitor擁有者線程來調(diào)用刽酱。線程成為monitor擁有者方式有:

  1. synchronized實(shí)例方法喳逛。
  2. synchronized語句塊。
  3. synchronized靜態(tài)方法棵里。即Class實(shí)例的方法润文。

Java對(duì)象的實(shí)現(xiàn)由Monitor Object、Monitor Lock和Monitor Condition三部分組成殿怜。[2]

5 wait

使當(dāng)前線程等待典蝌,直到另一個(gè)線程調(diào)用notify方法或notifyAll方法、或者超時(shí)头谜。

當(dāng)前線程必須用于對(duì)象monitor骏掀。

此方法使當(dāng)前線程\text{T}被放入這個(gè)對(duì)象的等待集中,然后釋放所有這個(gè)對(duì)象上的同步聲明柱告。線程\text{T}進(jìn)入休眠狀態(tài)截驮,直到:

  1. 其他線程調(diào)用對(duì)象的notify,線程\text{T}恰好被選中际度。
  2. 其他線程調(diào)用對(duì)象的notifyAll葵袭。
  3. 其他線程調(diào)用\text{T}interrupt方法。
  4. 用盡超時(shí)時(shí)間乖菱。

線程喚醒后坡锡,會(huì)先從等待集合中移除蓬网,并重新進(jìn)入調(diào)度行列。被喚醒線程與其他線程同步以常規(guī)方式競爭對(duì)象同步的權(quán)限鹉勒。一旦獲取了對(duì)象所有權(quán)帆锋,所有的對(duì)象同步聲明將恢復(fù)為原狀(quo ante),即調(diào)用wait時(shí)的狀態(tài)禽额。

線程也可以在不被通知锯厢、中斷或超時(shí)的情況下被喚醒,即所謂的“虛假喚醒”绵疲。雖然哲鸳,這種情況在實(shí)踐中很少發(fā)生,但應(yīng)用程序必須通過測試本應(yīng)導(dǎo)致線程被喚醒的條件盔憨,并在條件不滿足時(shí)繼續(xù)等待來防范這種情況。換句話說讯沈,等待應(yīng)該總是以循環(huán)的形式出現(xiàn)郁岩,就像這樣:

synchronized (obj) {
    while (<condition does not hold>)
        obj.wait(timeout);
    // Perform action appropriate to condition
}

如果當(dāng)前線程在等待之前或等待期間被任何線程中斷,則拋出InterruptedException缺狠。只是在對(duì)象的鎖狀態(tài)恢復(fù)之前问慎,不會(huì)拋出。也就是說挤茄,如果當(dāng)前線程被中斷時(shí)如叼,對(duì)象monitor被其他線程擁有,當(dāng)前線程只有獲得對(duì)象monitor才能夠拋出異常穷劈。

注意笼恰,wait方法在將當(dāng)前線程放入此對(duì)象的等待集中時(shí),只解鎖此對(duì)象歇终;在線程等待期間社证,當(dāng)前線程可能同步的任何其他對(duì)象都將保持鎖定狀態(tài)。

6 finalize

當(dāng)垃圾回收器確定對(duì)象不再被引用時(shí)评凝,垃圾回收器調(diào)用對(duì)象的這個(gè)方法追葡。子類重寫finalize方法,用于釋放系統(tǒng)資源或執(zhí)行其他清理工作奕短。

關(guān)于finalize一般約定:

  1. 當(dāng)不再有任何存活線程以任何方式訪問該對(duì)象時(shí)宜肉,則調(diào)用finalize,除非已經(jīng)被某個(gè)對(duì)象或類執(zhí)行finalize時(shí)調(diào)用過翎碑。

finalize方法的用途:

  1. 使此對(duì)象對(duì)其他線程再次可用谬返。
  2. 在對(duì)象被回收之前執(zhí)行清理操作。例如杈女,I/O連接對(duì)象的finalize方法可能會(huì)執(zhí)行顯式I/O事務(wù)朱浴,以便在對(duì)象被回收之前斷開連接吊圾。

Java并不保證哪個(gè)線程將調(diào)用對(duì)象的finalize方法,但是翰蠢,可以保證的是調(diào)用finalize的線程在調(diào)用finalize時(shí)不會(huì)持有任何用戶可見的同步鎖项乒。如果finalize方法執(zhí)行時(shí)拋出未捕獲的異常,則將忽略該異常梁沧,并終止執(zhí)行該對(duì)象的finalization檀何。

調(diào)用對(duì)象finalize方法之后,虛擬機(jī)不會(huì)做任何動(dòng)作廷支,直到它再次確定不再有任何活躍線程以任何方法引用該對(duì)象频鉴,包括其他即將終止的對(duì)象或類可能執(zhí)行的操作,這時(shí)恋拍,對(duì)象可能會(huì)被丟棄垛孔。

對(duì)于一個(gè)對(duì)象,finalize方法不會(huì)被虛擬機(jī)調(diào)用多次施敢,也就是說最多一次周荐。

代碼實(shí)例:

static class Test {
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("Finalized!!!");
    }
}

public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(() -> {
        try {
            Test test = new Test();
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
        }
        System.out.println(Thread.currentThread().getName() + " finished");
    });

    thread.start();
    thread.join(); // 如果注釋掉,則不會(huì)執(zhí)行finalize

    System.gc();

    TimeUnit.SECONDS.sleep(10);
}

參考資料

  1. Object
  2. 關(guān)于synchronized的Monitor Object機(jī)制的研究
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末僵娃,一起剝皮案震驚了整個(gè)濱河市概作,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌默怨,老刑警劉巖讯榕,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匙睹,居然都是意外死亡愚屁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門垃僚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來集绰,“玉大人,你說我怎么就攤上這事谆棺≡匝啵” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵改淑,是天一觀的道長碍岔。 經(jīng)常有香客問我,道長朵夏,這世上最難降的妖魔是什么蔼啦? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮仰猖,結(jié)果婚禮上捏肢,老公的妹妹穿的比我還像新娘奈籽。我一直安慰自己,他們只是感情好鸵赫,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布衣屏。 她就那樣靜靜地躺著,像睡著了一般辩棒。 火紅的嫁衣襯著肌膚如雪狼忱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天一睁,我揣著相機(jī)與錄音钻弄,去河邊找鬼。 笑死者吁,一個(gè)胖子當(dāng)著我的面吹牛窘俺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播复凳,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼批销,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了染坯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤丘逸,失蹤者是張志新(化名)和其女友劉穎单鹿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體深纲,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仲锄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了湃鹊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儒喊。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖币呵,靈堂內(nèi)的尸體忽然破棺而出怀愧,到底是詐尸還是另有隱情,我是刑警寧澤余赢,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布芯义,位于F島的核電站,受9級(jí)特大地震影響妻柒,放射性物質(zhì)發(fā)生泄漏扛拨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一举塔、第九天 我趴在偏房一處隱蔽的房頂上張望绑警。 院中可真熱鬧求泰,春花似錦、人聲如沸计盒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽章郁。三九已至枉氮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暖庄,已是汗流浹背聊替。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留培廓,地道東北人惹悄。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像肩钠,于是被迫代替她去往敵國和親泣港。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 對(duì)象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法价匠,而不是構(gòu)造函數(shù)創(chuàng)建對(duì)象:僅僅是創(chuàng)建對(duì)象的方法当纱,并非Fa...
    孫小磊閱讀 1,996評(píng)論 0 3
  • Java中所有的類都繼承自java.lang.Object類,Object類中一共有11個(gè)方法: getClass...
    zhong0316閱讀 1,774評(píng)論 0 0
  • Object類位于java.lang包中,java.lang包有最基礎(chǔ)的和核心的類,在編譯時(shí)會(huì)自動(dòng)導(dǎo)入; Obje...
    遇見你的故事閱讀 590評(píng)論 0 0
  • 本系列出于AWeiLoveAndroid的分享踩窖,在此感謝坡氯,再結(jié)合自身經(jīng)驗(yàn)查漏補(bǔ)缺,完善答案洋腮。以成系統(tǒng)箫柳。 Java基...
    濟(jì)公大將閱讀 1,529評(píng)論 1 6
  • Java中的Object類是所有類的父類,它提供了以下11個(gè)方法: public final native Cla...
    CHSmile閱讀 498評(píng)論 0 0