摘要:類深入研究類有哪些方法底層實現不研究還有重載了兩個一共有個方法,其中一個為底層的實現,其中兩個和重載方法。而沒有對鎖釋放但是要注意的是方法調用后,被喚醒的線程不會立馬獲得到鎖對象。
Object類深入研究
Object類有哪些方法
registerNatives()【底層實現、不研究】
hashCode()
equals(Object obj)
clone()
toString()
notify()
notifyAll()
wait(long timeout)【還有重載了兩個】
finalize()
Object一共有11個方法,其中一個為底層的實現registerNatives(),其中兩個wait()和wait(long timeout, int nanos)重載方法。
還有一個屬性:返回字節碼文件對象
hashCode
public native int hashCode();由native方法底層實現了
equals
public boolean equals(Object obj) { return (this == obj); }直接判斷內存地址了
想要更加清晰它們究竟是做什么的,我們來讀讀它的注釋:
根據注釋我們可以總結以下的要點:
重寫equals()方法,就必須重寫hashCode()的方法
equals()方法默認是比較對象的地址,使用的是==等值運算符
hashCode()方法對底層是散列表的對象有提升性能的功能
同一個對象(如果該對象沒有被修改):那么重復調用hashCode()那么返回的int是相同的!
hashCode()方法默認是由對象的地址轉換而來的
equals()方法還有5個默認的原則:
自反性--->調用equals()返回的是true,無論這兩個對象誰調用equals()都好,返回的都是true
一致性--->只要對象沒有被修改,那么多次調用還是返回對應的結果!
傳遞性--->x.equals(y)和y.equals(z)都返回true,那么可以得出:x.equals(z)返回true
對稱性--->x.equals(y)和y.equals(x)結果應該是相等的。
傳入的參數為null,返回的是false
為啥說hashCode()以散列表為底層帶來性能的提升是很容易理解的。我們再來回顧一下HashMap的插入:
如果hash值都不相等,那么可以直接判斷該key是不相等的了!
toString
toString方法主要是用來標識該對象的
clone
clone方法用于對象的克隆,一般想要克隆出的對象是獨立的(與原有的對象是分開的)
深拷貝指的是該對象的成員變量(如果是可變引用)都應該克隆一份,淺拷貝指的是成員變量沒有被克隆一份
如何克隆對象?
克隆的對象要實現Cloneable接口
重寫clone方法,最好修飾成public
wait & notify & notifyAll
wait和notify方法其實就是Java給我們提供讓線程之間通信的API。
無論是wait、notify還是notifyAll()都需要由監聽器對象(鎖對象)來進行調用
簡單來說:他們都是在同步代碼塊中調用的,否則會拋出異常!
notify()喚醒的是在等待隊列的某個線程(不確定會喚醒哪個),notifyAll()喚醒的是等待隊列所有線程
導致wait()的線程被喚醒可以有4種情況
該線程被中斷
wait()時間到了
被notify()喚醒
被notifyAll()喚醒
調用wait()的線程會釋放掉鎖
為什么wait和notify在Object方法上
因為我們的鎖是對象鎖【要是忘記的同學可回顧:Java鎖機制了解一下】,每個對象都可以成為鎖。讓當前線程等待某個對象的鎖,當然應該通過這個對象來操作了
鎖對象是任意的,所以這些方法必須定義在Object類中
Thread.sleep()與Object.wait()
二者都可以暫停當前線程,釋放CPU控制權。
主要的區別在于Object.wait()在釋放CPU同時,釋放了對象鎖的控制。
而Thread.sleep()沒有對鎖釋放
但是要注意的是:
notify方法調用后,被喚醒的線程不會立馬獲得到鎖對象。而是等待notify的synchronized代碼塊執行完之后才會獲得鎖對象
finalize
finalize()`方法將在垃圾回收器清除對象之前調用,但該方法不知道何時調用,具有不定性
一般我們都不會重寫它~
一個對象的finalize()方法只會被調用一次,而且finalize()被調用不意味著gc會立即回收該對象,所以有可能調用finalize()后,該對象又不需要被回收了,然后到了真正要被回收的時候,因為前面調用過一次,所以不會調用finalize(),產生問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73514.html
摘要:所以我決定先從類入手,深入的研究一番來開個好頭。之所以會有以上的效果,是因為有字符串常量池的存在。同時運行時實例創建的全局字符串常量池中有一個表,總是為池中的每個字符串對象維護一個引用,所以這些對象不會被。 開始寫 Java 一年來,一直都是遇到什么問題再去解決,還沒有主動的深入的去學習過 Java 語言的特性和深入閱讀 JDK 的源碼。既然決定今后靠 Java吃飯,還是得花些心思在上...
摘要:在這篇文章中,分享了他如何克服恐懼并開始使用源代碼來提高他的知識和技能。不久之后,你正在閱讀的源代碼將引導您進入規范。 通過閱讀源碼來提高js知識 原文傳送門:《Improve Your JavaScript Knowledge By Reading Source Code》 showImg(https://segmentfault.com/img/remote/14600000197...
摘要:一名年工作經驗的程序員應該具備的技能,這可能是程序員們比較關心的內容。數據結構和算法分析數據結構和算法分析,對于一名程序員來說,會比不會好而且在工作中能派上用場。 一名3年工作經驗的Java程序員應該具備的技能,這可能是Java程序員們比較關心的內容。我這里要說明一下,以下列舉的內容不是都要會的東西—-但是如果你掌握得越多,最終能得到的評價、拿到的薪水勢必也越高。 1、基本語法 這包括...
摘要:什么是字節碼程序通過編譯之后生成文件就是字節碼集合正是有這樣一種中間碼字節碼,使得等函數語言只用實現一個編譯器即可運行在上。 什么是字節碼? java程序通過javac編譯之后生成文件.class就是字節碼集合,正是有這樣一種中間碼(字節碼),使得scala/groovy/clojure等函數語言只用實現一個編譯器即可運行在JVM上。看看一段簡單代碼。 public long ...
摘要:把內存分成兩種,一種叫做棧內存,一種叫做堆內存在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配。堆內存用于存放由創建的對象和數組。 一次慘痛的阿里技術面 就在昨天,有幸接到了阿里的面試通知,本來我以為自己的簡歷應該不會的到面試的機會了,然而機會卻這么來了,我卻沒有做好準備,被面試官大大一通血虐。因此,我想寫點東西紀念一下這次的經歷,也當一次教訓了。其實面試官大大...
閱讀 1357·2021-11-22 15:25
閱讀 3350·2021-10-21 09:38
閱讀 1564·2021-10-19 13:21
閱讀 992·2021-09-06 15:00
閱讀 1674·2019-08-30 15:44
閱讀 2578·2019-08-29 15:40
閱讀 3432·2019-08-29 13:44
閱讀 2024·2019-08-26 16:56