《Java編程的邏輯》筆記26--剖析包裝類 (上)

剖析包裝類 (上).png

包裝類是什么呢?

它是一個類叔遂,內(nèi)部有一個實例變量他炊,保存對應(yīng)的基本類型的值, 這個類一般還有一些靜態(tài)方法已艰、靜態(tài)變量和實例方法痊末,以方便對數(shù)據(jù)進行操作。

  • 八種基本類型哩掺,對應(yīng)的包裝類


    image.png

基本類型和包裝類

  • 裝箱
    將基本類型轉(zhuǎn)換為包裝類的過程
  • 拆箱
    將包裝類型轉(zhuǎn)換為基本類型的過程
    自動裝箱和拆箱
    Java 1.5以后引入凿叠,可以直接將基本類型賦值給引用類型,反之亦可
Integer a = 100; 
int b = a;
Integer a = Integer.valueOf(100);
int b = a.intValue();

自動裝箱/拆箱是Java編譯器提供的能力嚼吞,背后盒件,它會替換為調(diào)用對應(yīng)的valueOf()/xxxValue()
可以通過new創(chuàng)建

Integer a = new Integer(100);
Boolean b = new Boolean(true);
Double d = new Double(12.345);
Character c = new Character('馬');

那到底應(yīng)該用靜態(tài)的valueOf方法,還是使用new呢舱禽?
般建議使用valueOf
new每次都會創(chuàng)建一個新對象炒刁,而除了Float和Double外的其他包裝類, 都會緩存包裝類對象誊稚,減少需要創(chuàng)建對象的次數(shù)翔始,節(jié)省空間,提升性能

重寫Object方法

  • equals
    equals用于判斷當前對象和參數(shù)傳入的對象是否相同里伯,Object類的默認實現(xiàn)是比較址城瞎, 對于兩個變量,只有這兩個變量指向同一個對象時疾瓮,equals才返回true脖镀,它和比較運算符(==)的結(jié)果是一樣的。
    equals應(yīng)該反映的是對象間的邏輯相等關(guān)系
    Long
public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}

Float

public boolean equals(Object obj) {
    return (obj instanceof Float)
           && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}

Float有一個靜態(tài)方法floatToIntBits()狼电,將float的二進制表示看做int认然。 需要注意的是补憾,只有兩個float的二進制表示完全一樣的時候,equals才會返回true
Double的equals方法與Float類似卷员,它有一個靜態(tài)方法doubleToLongBits盈匾,將double的二進制表示看做long,然后再按long比較,數(shù)值不精確

  • hashCode
    hashCode返回一個對象的哈希值毕骡,哈希值是一個int類型的數(shù)削饵,由對象中一般不變的屬性映射得來,用于快速對對象進行區(qū)分未巫、分組等窿撬。一個對象的哈希值不能變,相同對象的哈希值必須一樣叙凡。不同對象的哈希值一般應(yīng)不同劈伴,但這不是必須的,可以有不同對象但哈希值相同的情況握爷。
    hashCode和equals方法聯(lián)系密切跛璧,對兩個對象,如果equals方法返回true新啼,則hashCode也必須一樣追城。反之不要求
    子類重寫equals時,也必須重寫hashCode
    之所以有這個約定燥撞,是因為Java API中很多類依賴于這個行為座柱,尤其是集合中的一些類
    Byte, Short, Integer, Character,hashCode就是其內(nèi)部值
public int hashCode() {
    return (int)value;
}

Boolean

public int hashCode() {
    return value ? 1231 : 1237;
}

Long

public int hashCode() {
    return (int)(value ^ (value >>> 32));
}

是高32位與低32位進行位異或操作
Float

public int hashCode() {
    return floatToIntBits(value);
}

Double

public int hashCode() {
    long bits = doubleToLongBits(value);
    return (int)(bits ^ (bits >>> 32));
}
  • toString
    每個包裝類也都重寫了toString方法物舒,返回對象的字符串表示
  • Comparable
    個包裝類也都實現(xiàn)了Java API中的Comparable接口
public interface Comparable<T> {
    public int compareTo(T o);
}

<T>是泛型語法色洞,我們后續(xù)文章介紹,T表示比較的類型冠胯,由實現(xiàn)接口的類傳入锋玲。 接口只有一個方法compareTo,當前對象與參數(shù)對象進行比較涵叮,在小于、等于伞插、大于參數(shù)時割粮,應(yīng)分別返回-1,0媚污,1
對于Float和Double舀瓢,存在和equals一樣的問題,0.01和0.10.1相比的結(jié)果并不為0*

  • 包裝類和String
    除了toString方法外耗美,包裝類還有一些其他與String相關(guān)的方法
System.out.println(Integer.toBinaryString(12345)); //輸出2進制
System.out.println(Integer.toHexString(12345)); //輸出16進制
System.out.println(Integer.parseInt("3039", 16)); //按16進制解析
11000000111001
3039
12345

常用常量

Boolean類型

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false)

Integer

public static final int   MIN_VALUE = 0x80000000;
public static final int   MAX_VALUE = 0x7fffffff;

Float和Double

public static final double POSITIVE_INFINITY = 1.0 / 0.0;
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
public static final double NaN = 0.0d / 0.0;

Number

六種數(shù)值類型包裝類有一個共同的父類Number
抽象類
方法

byte byteValue()
short shortValue()                
int intValue()
long longValue()
float floatValue()
double doubleValue()

不可變性
包裝類都是不可變類
這是通過如下方式強制實現(xiàn)的:
所有包裝類都聲明為了final京髓,不能被繼承
內(nèi)部基本類型值是私有的航缀,且聲明為了final
沒有定義setter方法
不可變使得程序可以更為簡單安全,因為不用操心數(shù)據(jù)被意外改寫的可能了堰怨,可以安全的共享數(shù)據(jù)芥玉,尤其是在多線程的環(huán)境下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市备图,隨后出現(xiàn)的幾起案子灿巧,更是在濱河造成了極大的恐慌,老刑警劉巖揽涮,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抠藕,死亡現(xiàn)場離奇詭異,居然都是意外死亡蒋困,警方通過查閱死者的電腦和手機盾似,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雪标,“玉大人零院,你說我怎么就攤上這事√” “怎么了门粪?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烹困。 經(jīng)常有香客問我玄妈,道長,這世上最難降的妖魔是什么髓梅? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任拟蜻,我火速辦了婚禮,結(jié)果婚禮上枯饿,老公的妹妹穿的比我還像新娘酝锅。我一直安慰自己,他們只是感情好奢方,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布搔扁。 她就那樣靜靜地躺著,像睡著了一般蟋字。 火紅的嫁衣襯著肌膚如雪稿蹲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天鹊奖,我揣著相機與錄音苛聘,去河邊找鬼。 笑死,一個胖子當著我的面吹牛设哗,可吹牛的內(nèi)容都是我干的唱捣。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼网梢,長吁一口氣:“原來是場噩夢啊……” “哼震缭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澎粟,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蛀序,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后活烙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徐裸,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年啸盏,在試婚紗的時候發(fā)現(xiàn)自己被綠了重贺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡回懦,死狀恐怖气笙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怯晕,我是刑警寧澤潜圃,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站舟茶,受9級特大地震影響谭期,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吧凉,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一隧出、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阀捅,春花似錦胀瞪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至忍级,卻和暖如春帆谍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颤练。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗦玖。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓患雇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宇挫。 傳聞我的和親對象是個殘疾皇子苛吱,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

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