成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Object類深入研究

MiracleWong / 3546人閱讀

摘要:類深入研究類有哪些方法底層實(shí)現(xiàn)不研究還有重載了兩個(gè)一共有個(gè)方法,其中一個(gè)為底層的實(shí)現(xiàn),其中兩個(gè)和重載方法。而沒(méi)有對(duì)鎖釋放但是要注意的是方法調(diào)用后,被喚醒的線程不會(huì)立馬獲得到鎖對(duì)象。

Object類深入研究

Object類有哪些方法

registerNatives()【底層實(shí)現(xiàn)、不研究】

hashCode()

equals(Object obj)

clone()

toString()

notify()

notifyAll()

wait(long timeout)【還有重載了兩個(gè)】

finalize()

Object一共有11個(gè)方法,其中一個(gè)為底層的實(shí)現(xiàn)registerNatives(),其中兩個(gè)wait()wait(long timeout, int nanos)重載方法。

還有一個(gè)屬性:返回字節(jié)碼文件對(duì)象

hashCode

public native int hashCode();

由native方法底層實(shí)現(xiàn)了

equals

public boolean equals(Object obj) {
    return (this == obj);
}

直接判斷內(nèi)存地址了

想要更加清晰它們究竟是做什么的,我們來(lái)讀讀它的注釋:


根據(jù)注釋我們可以總結(jié)以下的要點(diǎn):

重寫equals()方法,就必須重寫hashCode()的方法

equals()方法默認(rèn)是比較對(duì)象的地址,使用的是==等值運(yùn)算符

hashCode()方法對(duì)底層是散列表的對(duì)象有提升性能的功能

同一個(gè)對(duì)象(如果該對(duì)象沒(méi)有被修改):那么重復(fù)調(diào)用hashCode()那么返回的int是相同的!

hashCode()方法默認(rèn)是由對(duì)象的地址轉(zhuǎn)換而來(lái)的

equals()方法還有5個(gè)默認(rèn)的原則:

自反性--->調(diào)用equals()返回的是true,無(wú)論這兩個(gè)對(duì)象誰(shuí)調(diào)用equals()都好,返回的都是true

一致性--->只要對(duì)象沒(méi)有被修改,那么多次調(diào)用還是返回對(duì)應(yīng)的結(jié)果!

傳遞性--->x.equals(y)y.equals(z)都返回true,那么可以得出:x.equals(z)返回true

對(duì)稱性--->x.equals(y)y.equals(x)結(jié)果應(yīng)該是相等的。

傳入的參數(shù)為null,返回的是false

為啥說(shuō)hashCode()以散列表為底層帶來(lái)性能的提升是很容易理解的。我們?cè)賮?lái)回顧一下HashMap的插入:

如果hash值都不相等,那么可以直接判斷該key是不相等的了!

toString

toString方法主要是用來(lái)標(biāo)識(shí)該對(duì)象的

clone

clone方法用于對(duì)象的克隆,一般想要克隆出的對(duì)象是獨(dú)立的(與原有的對(duì)象是分開的)

深拷貝指的是該對(duì)象的成員變量(如果是可變引用)都應(yīng)該克隆一份,淺拷貝指的是成員變量沒(méi)有被克隆一份

如何克隆對(duì)象?

克隆的對(duì)象要實(shí)現(xiàn)Cloneable接口

重寫clone方法,最好修飾成public

wait & notify & notifyAll

wait和notify方法其實(shí)就是Java給我們提供讓線程之間通信的API。

無(wú)論是wait、notify還是notifyAll()都需要由監(jiān)聽器對(duì)象(鎖對(duì)象)來(lái)進(jìn)行調(diào)用

簡(jiǎn)單來(lái)說(shuō):他們都是在同步代碼塊中調(diào)用的,否則會(huì)拋出異常!

notify()喚醒的是在等待隊(duì)列的某個(gè)線程(不確定會(huì)喚醒哪個(gè)),notifyAll()喚醒的是等待隊(duì)列所有線程

導(dǎo)致wait()的線程被喚醒可以有4種情況

該線程被中斷

wait()時(shí)間到了

notify()喚醒

notifyAll()喚醒

調(diào)用wait()的線程會(huì)釋放掉鎖

為什么wait和notify在Object方法上

因?yàn)槲覀兊?strong>鎖是對(duì)象鎖【要是忘記的同學(xué)可回顧:Java鎖機(jī)制了解一下】,每個(gè)對(duì)象都可以成為鎖。讓當(dāng)前線程等待某個(gè)對(duì)象的鎖,當(dāng)然應(yīng)該通過(guò)這個(gè)對(duì)象來(lái)操作了

鎖對(duì)象是任意的,所以這些方法必須定義在Object類中

Thread.sleep()Object.wait()

二者都可以暫停當(dāng)前線程,釋放CPU控制權(quán)。

主要的區(qū)別在于Object.wait()在釋放CPU同時(shí),釋放了對(duì)象鎖的控制

Thread.sleep()沒(méi)有對(duì)鎖釋放

但是要注意的是:

notify方法調(diào)用后,被喚醒的線程不會(huì)立馬獲得到鎖對(duì)象。而是等待notify的synchronized代碼塊執(zhí)行完之后才會(huì)獲得鎖對(duì)象

finalize

finalize()`方法將在垃圾回收器清除對(duì)象之前調(diào)用,但該方法不知道何時(shí)調(diào)用,具有不定性

一般我們都不會(huì)重寫它~

一個(gè)對(duì)象的finalize()方法只會(huì)被調(diào)用一次,而且finalize()被調(diào)用不意味著gc會(huì)立即回收該對(duì)象,所以有可能調(diào)用finalize()后,該對(duì)象又不需要被回收了,然后到了真正要被回收的時(shí)候,因?yàn)榍懊嬲{(diào)用過(guò)一次,所以不會(huì)調(diào)用finalize(),產(chǎn)生問(wèn)題。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73514.html

相關(guān)文章

  • 深入研究Java String

    摘要:所以我決定先從類入手,深入的研究一番來(lái)開個(gè)好頭。之所以會(huì)有以上的效果,是因?yàn)橛凶址A砍氐拇嬖?。同時(shí)運(yùn)行時(shí)實(shí)例創(chuàng)建的全局字符串常量池中有一個(gè)表,總是為池中的每個(gè)字符串對(duì)象維護(hù)一個(gè)引用,所以這些對(duì)象不會(huì)被。 開始寫 Java 一年來(lái),一直都是遇到什么問(wèn)題再去解決,還沒(méi)有主動(dòng)的深入的去學(xué)習(xí)過(guò) Java 語(yǔ)言的特性和深入閱讀 JDK 的源碼。既然決定今后靠 Java吃飯,還是得花些心思在上...

    番茄西紅柿 評(píng)論0 收藏0
  • 通過(guò)閱讀源碼來(lái)提高js知識(shí)

    摘要:在這篇文章中,分享了他如何克服恐懼并開始使用源代碼來(lái)提高他的知識(shí)和技能。不久之后,你正在閱讀的源代碼將引導(dǎo)您進(jìn)入規(guī)范。 通過(guò)閱讀源碼來(lái)提高js知識(shí) 原文傳送門:《Improve Your JavaScript Knowledge By Reading Source Code》 showImg(https://segmentfault.com/img/remote/14600000197...

    浠ラ箍 評(píng)論0 收藏0
  • 一名3年工作經(jīng)驗(yàn)的java程序員應(yīng)該具備的職業(yè)技能

    摘要:一名年工作經(jīng)驗(yàn)的程序員應(yīng)該具備的技能,這可能是程序員們比較關(guān)心的內(nèi)容。數(shù)據(jù)結(jié)構(gòu)和算法分析數(shù)據(jù)結(jié)構(gòu)和算法分析,對(duì)于一名程序員來(lái)說(shuō),會(huì)比不會(huì)好而且在工作中能派上用場(chǎng)。 一名3年工作經(jīng)驗(yàn)的Java程序員應(yīng)該具備的技能,這可能是Java程序員們比較關(guān)心的內(nèi)容。我這里要說(shuō)明一下,以下列舉的內(nèi)容不是都要會(huì)的東西—-但是如果你掌握得越多,最終能得到的評(píng)價(jià)、拿到的薪水勢(shì)必也越高。 1、基本語(yǔ)法 這包括...

    renweihub 評(píng)論0 收藏0
  • 深入字節(jié)碼 -- 計(jì)算方法執(zhí)行時(shí)間

    摘要:什么是字節(jié)碼程序通過(guò)編譯之后生成文件就是字節(jié)碼集合正是有這樣一種中間碼字節(jié)碼,使得等函數(shù)語(yǔ)言只用實(shí)現(xiàn)一個(gè)編譯器即可運(yùn)行在上。 什么是字節(jié)碼? java程序通過(guò)javac編譯之后生成文件.class就是字節(jié)碼集合,正是有這樣一種中間碼(字節(jié)碼),使得scala/groovy/clojure等函數(shù)語(yǔ)言只用實(shí)現(xiàn)一個(gè)編譯器即可運(yùn)行在JVM上??纯匆欢魏?jiǎn)單代碼。 public long ...

    娣辯孩 評(píng)論0 收藏0
  • 記一次慘痛的面試經(jīng)歷

    摘要:把內(nèi)存分成兩種,一種叫做棧內(nèi)存,一種叫做堆內(nèi)存在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配。堆內(nèi)存用于存放由創(chuàng)建的對(duì)象和數(shù)組。 一次慘痛的阿里技術(shù)面 就在昨天,有幸接到了阿里的面試通知,本來(lái)我以為自己的簡(jiǎn)歷應(yīng)該不會(huì)的到面試的機(jī)會(huì)了,然而機(jī)會(huì)卻這么來(lái)了,我卻沒(méi)有做好準(zhǔn)備,被面試官大大一通血虐。因此,我想寫點(diǎn)東西紀(jì)念一下這次的經(jīng)歷,也當(dāng)一次教訓(xùn)了。其實(shí)面試官大大...

    CoorChice 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<