解讀java.lang包下Object類的API(一)

說明:

?????????? object是類層次的根類人乓,所有類的父(超)類

一拨扶、registerNatives()

private static native void registerNatives();

? ? static {

? ? ? ? registerNatives();

? ? }

? ?? native表明一個java接口調(diào)用非java接口

? ?? 為了讓JVM找到本地函數(shù)句伶,以某種規(guī)則命名稳懒,將java方法注冊到本地

? ?? 例如:java.lang.Object.registerNatives()對應(關聯(lián))本地函數(shù)C語言的Java_java_lang_Object_registerNatives方法

二儡羔、getClass()

public final native Class getClass();? ?

? ?? 返回該對象運行時的類的對象

? ?? 例如 定義一個類Person 程癌,創(chuàng)建一個Person對象嘴瓤, Person p= new Person()扫外;

? ?? 此時調(diào)用p.getClass() 返回值即為Person類的對象即: Class c=p.getClass();

? ?? 可通過方法獲取該類的名稱等信息:c.getName() ,結果為"Person"

? ?? 此方法常用于反射

三、hashCode()

public native int hashCode();

? ?? 返回當前對象的哈希值 本地方法

? ?? hashCode常規(guī)協(xié)定:

? ?? 在java應用執(zhí)行期間廓脆,對同一對象多次調(diào)用haseCode方法筛谚,必須返回相同的整數(shù)(前提:equals比較時信息沒有被修改)

? ??? 通過equals方法比較,兩個對象相等停忿,返回的值必須相同整數(shù)

? ??? 通過equals方法比較驾讲,兩個對象不同,不一定生成不同的整數(shù)席赂,但是不同對象生成不同的整數(shù)可以提高哈希表的性能

四吮铭、equals(Object obj)

public boolean equals(Object obj) {

? ? ? ? return (this == obj);

? ? }

? ?? 返回布爾值,表示其他對象是否與本對象相等

? ?? 參數(shù):Object類型

? ?? 返回值:

? ?? 特點:

? ??? ? 自反性:對于任何非空引用值X颅停,自己和自己比較即:X.equals(x)谓晌,結果都為true

? ??? ? 對稱性:對于任何非空引用值X和Y,當X.equals(Y)結果為true時癞揉,Y.equals(X)的結果一定為true

? ??? ? 傳遞性:對于任何非空引用值X纸肉、Y和Z溺欧,當X.equals(Y)結果為true,Y.equals(Z)的結果為true時毁靶,X.equals(Z)的值一定為true

? ??? ? 一致性:對于任何非空引用值X和Y胧奔,多次調(diào)用X.equals(Y)始終返回相同的值true或者false (前提equals對比的信息沒有修改)

? ??? ? 對于任何非空引用值X,X.equals(null) 的結果都為false

? ?? 注意:

? ??? ? Object中對于任何非空引用值X和Y预吆,當且僅當X和Y指向同一對象時龙填,返回值為true

? ??? ? 重寫equals方法時建議要重寫hashCode()方法以便維護haseCode的常規(guī)協(xié)定

五、clone()

protected native Object clone() throws CloneNotSupportedException;

? ?? 此方法為淺拷貝拐叉,本地方法

? ?? 返回值:返回當前對象的“副本”

? ?? 作用:需要獲取到一個對象的拷貝用戶某些處理岩遗,可以用此方法復制

? ?? 注意:

? ?? 淺拷貝:當對象中含有可變的引用類型屬性時,復制得到的新對象對自己引用類型屬性進行修改時凤瘦,原始對象的引用類型屬性也會跟著改變

? ??? ? ? ? 原因:復制時宿礁,對象的屬性是基本類型是,對該字段進行復制蔬芥,對象的屬性是引用類型時梆靖,復制該字段的引用而不復制該引用指向的對象

? ??? ? ? 深拷貝:當對象中含有可變的引用類型屬性時,復制得到的新對象對自己引用類型屬性進行修改時笔诵,原始對象的引用類型屬性不會跟著改變

? ??? ? ? ? ? ? 適用于引用類型變量比較少的情況

? ??? ? ? ? ? ? 需要自己改寫返吻,缺點:一個類當中有很多引用類型時,實現(xiàn)的代碼比較復雜

? ??? ? ? 當引用類型變量較多時乎婿,建議使用序列化和反序列化實現(xiàn)

? ??? ? ? 使用clone()方法時测僵,如果此對象的類不能實現(xiàn)Cloneable接口,會拋出CloneNotSupportedException

? ??? ? ? 由于Object類本身不實現(xiàn)Cloneable接口谢翎,所以對于Object對象調(diào)用clone方法會拋出異常

六捍靠、toString()

public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }

?????? 返回值:對象的類名+@+對象的哈希碼無符號十六進制表示,即對象的字符串表示形式

?????? 解讀:getClass().getName()

?????? ? ? ???? 調(diào)用本類方法可以不使用對象調(diào)用省略this. * 此處獲取該對象所屬的類名

?????? 解讀:Integer.toHexString(hashCode())

??????????????? 表示此對象的哈希碼無符號十六進制表示

????? 舉例說明森逮,傳入的int=123456 * 1.toHexString(int i)

???? 1. public static String toHexString(int i) { return toUnsignedString0(i, 4); }

??????????????? 參數(shù):要轉(zhuǎn)換成字符串的整數(shù)榨婆,此處傳入的是對象的哈希碼

???? 2.toUnsignedString0(i, 4); //此時toUnsignedString0(123456,4)

???????? private static String toUnsignedString0(int val, int shift) {

??????????????????? // assert shift > 0 && shift <=5 : "Illegal shift value";

??????????????????? int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val); //mag=32-Integer.numberOfLeadingZeros(123456)=32-15=17

??????????????????? int chars = Math.max(((mag + (shift - 1)) / shift), 1); //chars=Math.max(((17+(4-1))/4),1)=Math.max(5,1)=5

??????????????????? char[] buf = new char[chars]; //char[] buf =new char[chars]=new char[5]

?????????????????? formatUnsignedInt(val, shift, buf, 0, chars); //formatUnsingedInt(123456褒侧,4纲辽,buf,0,5)

????????????????? // Use special constructor which takes over "buf".

???????????????? return new String(buf, true); }

??????????? 私有方法:

????????????????? 參數(shù):

??????????????????????? val 表示傳入的整數(shù) 此處傳入的是對象的哈希碼;

??????????????????????? shift 表示進制4代表16進制

?????????????????????? Integer.SIZE 為32

???????? 3.Integer.numberOfLeadingZeros(int i) //即Integer.numberOfLeadingZeros(123456),執(zhí)行結果返回n=15

???????????? public static int numberOfLeadingZeros(int i) {

????????????????????? // HD, Figure 5-6

???????????????????? if (i == 0) return 32;

???????????????????? int n = 1;

???????????????????? if (i >>> 16 == 0) { n += 16; i <<= 16; }

???????????????????? if (i >>> 24 == 0) { n += 8; i <<= 8; }

???????????????????? if (i >>> 28 == 0) { n += 4; i <<= 4; }

???????????????????? if (i >>> 30 == 0) { n += 2; i <<= 2; }

???????????????????? n -= i >>> 31;

???????????????????? return n; }

???????? 參數(shù)璃搜,i 表示傳入整數(shù)拖吼,此處傳入的是對象的哈希碼 如果i的值為0,返回32 如果i不為零这吻,返回i的二進制補碼表示心事重最高位1位之前的零位數(shù)量

4.max(int a, int b)

???????? public static int max(int a, int b) { return (a >= b) ? a : b; } 參數(shù):整數(shù)a和整數(shù)比 返回值:比較a和b吊档,若a>=b,返回a;若a>>= shift;

?5.formatUnsignedInt(val, shift, buf, 0, chars);? //formatUnsingedInt(123456唾糯,4怠硼,buf,0,5)
?? ???? static int formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) {
?????? ??? ??? ??? ?int charPos = len;
?????? ??? ??? ??? ?int radix = 1 << shift; //表示2^shift 若shift=4 鬼贱,則表示2^4
?????? ??? ??? ??? ?int mask = radix - 1;
?????? ??? ??? ??? ?do {
?????????? ??? ??? ??? ?buf[offset + --charPos] = Integer.digits[val & mask];//val & mask =val%(mask+1)
?????????? ??? ??? ??? ?val >>>= shift;
?????? ??? ??? ??? ?} while (val != 0 && charPos > 0);
?????? ??? ??? ??? ?return charPos;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?其中Integer.digits[index] ,是一個集合,可通過index進行取數(shù)
?? ??? ??? ??? ? final static char[] digits = {
?? ??? ???????? '0' , '1' , '2' , '3' , '4' , '5' ,
?? ??? ???????? '6' , '7' , '8' , '9' , 'a' , 'b' ,
?? ??? ???????? 'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
?? ??? ???????? 'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
?? ??? ???????? 'o' , 'p' , 'q' , 'r' , 's' , 't' ,
?? ??? ???????? 'u' , 'v' , 'w' , 'x' , 'y' , 'z'
?? ??? ???? };
?? ??? ??? ??? ?formatUnsingedInt(123456香璃,4这难,buf,0,5)
?? ??? ??? ??? ?第一次執(zhí)行結果:charPos=5;radix=16葡秒;mask=15姻乓;buf[4]=Integer.digits[123456%(15+1)]=Integer.digits[0]=0;val==7716;charPos=4
?? ??? ??? ??? ?第二次執(zhí)行結果:buf[3]=Integer.digits[7716%(15+1)]=Integer.digits[4]=4;val=482;charPos=3
?? ??? ??? ??? ?第三次執(zhí)行結果:buf[2]=Integer.digits[482%16]=Integer.digits[2]=2;val=30;charPos=2
?? ??? ??? ??? ?第四次執(zhí)行結果:buf[1]=Integer.digits[30%16]=Integer.digits[14]=e;val=1;charPos=1
?? ??? ??? ??? ?第五次執(zhí)行結果:buf[0]=Integer.digits[1%16]=Integer.gigits[1]=1;val=0眯牧;charPos=0
?? ??? ??? ??? ?val=0停止運行buf={1蹋岩,e,2,4,0}
??? 6.對于標題2中return new String(buf,true)的返回值為1e240
?? ? 7.對于整個方法返回值為String@1e240

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末学少,一起剝皮案震驚了整個濱河市剪个,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌版确,老刑警劉巖扣囊,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绒疗,居然都是意外死亡侵歇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門忌堂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酗洒,你說我怎么就攤上這事士修。” “怎么了樱衷?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵棋嘲,是天一觀的道長。 經(jīng)常有香客問我矩桂,道長沸移,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任侄榴,我火速辦了婚禮雹锣,結果婚禮上,老公的妹妹穿的比我還像新娘癞蚕。我一直安慰自己蕊爵,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布桦山。 她就那樣靜靜地躺著攒射,像睡著了一般醋旦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上会放,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天饲齐,我揣著相機與錄音,去河邊找鬼咧最。 笑死捂人,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的窗市。 我是一名探鬼主播先慷,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咨察!你這毒婦竟也來了论熙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤摄狱,失蹤者是張志新(化名)和其女友劉穎脓诡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媒役,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡祝谚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酣衷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片交惯。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖穿仪,靈堂內(nèi)的尸體忽然破棺而出席爽,到底是詐尸還是另有隱情,我是刑警寧澤啊片,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布只锻,位于F島的核電站,受9級特大地震影響紫谷,放射性物質(zhì)發(fā)生泄漏齐饮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一笤昨、第九天 我趴在偏房一處隱蔽的房頂上張望祖驱。 院中可真熱鬧,春花似錦瞒窒、人聲如沸羹膳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陵像。三九已至就珠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間醒颖,已是汗流浹背妻怎。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泞歉,地道東北人逼侦。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像腰耙,于是被迫代替她去往敵國和親榛丢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理挺庞,服務發(fā)現(xiàn)晰赞,斷路器,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • 三重:代碼选侨、底層內(nèi)存掖鱼、源碼 第一階段:開發(fā)常用JavaSE基礎、IDE援制、Maven戏挡、Gradle、SVN晨仑、Git褐墅、...
    guodd369閱讀 16,601評論 1 44
  • 我想要的… 是義無反顧的"非你不可"妥凳, 不是權衡得失后的牽強拉扯。 --1-- 夏天問我码泛,人怎么可以變得這么快呢猾封?...
    宋飯飯閱讀 453評論 0 0
  • 2017年12月17日澄耍,2017年就剩下半個月了 俺連續(xù)一周熬夜噪珊,就是為了寫年終總結,做總結屁屁踢齐莲,為自己的年終獎...
    壹本正經(jīng)閱讀 234評論 0 0