Java探秘之基本數(shù)據(jù)類型和包裝類(int,Integer)

java有八種基本數(shù)據(jù)類型分別是关顷,char糊秆、shoat武福、int议双、float、double捉片、long平痰、byte、boolean伍纫。

而它們對應的包裝類也有宗雇,Character、Shoat莹规、Integer赔蒲、Float、Double良漱、Long舞虱、Byte、Boolean母市。

那么他們之間有什么區(qū)別呢矾兜,簡單來說他們是完全不同的概念,前者的java提供的基本數(shù)據(jù)類型患久,注意這里說了是基本數(shù)據(jù)類型椅寺;而后者則是java為它們提供常見處理的工具類浑槽,注意說了是類也就是它們存在著對象。

1.初始化

這里以int和Integer為例舉例說明返帕,當我們初始化一個int和一個Integer并沒有給定他們值時桐玻,前者默認值為0,而后者默認為null(空對象)荆萤。

當我們需要傳入一個參數(shù)時畸冲,對int、Integer的選擇就很重要观腊,如果我們傳入的Intger為null很有可能拋出一個空指針異常使我們的程序蹦掉邑闲;而選擇int時因為有初始值,不會出現(xiàn)Intger出現(xiàn)的問題梧油,但是另一個問題也接踵而來苫耸,

我們不知道傳入的int值的多少,很有可能就會給我們的程序埋了一個隱藏的bug儡陨;對于int還是Integer的選擇我們應該通過現(xiàn)實場景進行選擇褪子。

這里重點說一下,當我們使用MVC模式開發(fā)時骗村,Controller接收參數(shù)如果參數(shù)不存在嫌褪,而參數(shù)是int類型時就會拋出一個參數(shù)不存在異常,而Integer卻不會胚股,只是得到的參數(shù)為null笼痛。

2)自動拆箱,自動裝箱機制

自動拆箱和自動裝箱機制是在JDK1.5引進的一個新機制琅拌,觀察下面的代碼缨伊,為什么會有這樣的結(jié)果產(chǎn)生呢。

Integer a = 34;

int b = 34;

Integer c = b;

int d = a;

System.out.println( a == b);

System.out.println( d == c);

基本數(shù)據(jù)類型的和其包裝類的相互轉(zhuǎn)換进宝,這是為什么呢刻坊?

答案很簡單,因為我們在執(zhí)行Integer a = 34; 代碼時jdk默認執(zhí)行的是Integer a = Integer.valueOf(34);

而我們在執(zhí)行int d = a;時編譯執(zhí)行的卻是int d = a.intValue();

你可能會有疑問党晋,為什么會是這樣谭胚?

這個時候我們就需要打開源碼進行查看尋找答案。

/**

Returns an {@code Integer} instance representing the specified

{@code int} value. If a new {@code Integer} instance is not

required, this method should generally be used in preference to

the constructor {@link #Integer(int)}, as this method is likely

to yield significantly better space and time performance by

caching frequently requested values.

This method will always cache values in the range -128 to 127,

inclusive, and may cache other values outside of this range.

@param i an {@code int} value.

@return an {@code Integer} instance representing {@code i}.

@since 1.5

/

public static Integer valueOf(int i) {

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

文檔是這樣說的未玻,返回一個制定int數(shù)值的Integer對象實例灾而,這樣好像還不足以說明什么,那我們要如何證明我們是對的呢深胳?

我們可以查看他的編譯文件绰疤,一切就真相大白了(javac命令)。

public static void main(String[] var0) {

new User();

Integer var2 = Integer.valueOf(34);

byte var3 = 34;

Integer var4 = Integer.valueOf(var3);

int var5 = var2.intValue();

System.out.println(var2.intValue() == var3);

System.out.println(var5 == var4.intValue());

}

這好像就不需要我再多說什么了舞终。

細心的小伙伴會看到文檔里面有這么一句話?This method will always cache values in the range -128 to 127,inclusive, and may cache other values outside of this range.該方法會緩存-128到127之間的值轻庆,這句話又是什么意思呢癣猾。

Integer a = 120;Integer b = 120;Integer c = 300;Integer d = 300;System.out.println( a == b);System.out.println( d == c);這兩句代碼會輸出什么呢,小伙伴們肯定說都是true啊余爆,或者說都是false纷宇。會這樣說的小伙伴不能說你錯了,只能說你對了一半蛾方;是這樣的啊像捶,我們知道==運算符進行運算時,運算符兩邊如果都為基本數(shù)據(jù)類型的話那就直接對數(shù)值進行比較桩砰;但是如果兩邊或者一邊為非基本數(shù)據(jù)類型時拓春,即對象實例,則比較的是他們的內(nèi)存地址(如果為空對象的話則為null)亚隅,這里很明顯兩邊都是對象實例硼莽,所以比較的是內(nèi)存地址。

額煮纵?為什么是這樣呢懂鸵,按我們之前講得理論不是應該都為false才對嘛,因為他們比較的是內(nèi)存地址呀行疏。哈哈匆光,這就是我們之前講到的問題,Integer會緩存-128到127之間的數(shù)值酿联,而這么數(shù)值當然是緩存在一個對象實例里面啦终息,當我們需要使用時又進行取出(準確點來說是拿到的是它的引用),而不在這個范圍內(nèi)的數(shù)值當然都是重新創(chuàng)建實例啦货葬,有興趣的小伙伴可以進去看下源碼采幌。

3) 類型轉(zhuǎn)換

這是包裝類很大的存在原因劲够,試想一下震桶,我們有一個數(shù)值傳遞過來時是String或者說是Object類型,我們要怎么轉(zhuǎn)換成int類型呢征绎?

Integer的ValueOf可以將一個String類型轉(zhuǎn)換成int蹲姐。

使用強制類型轉(zhuǎn)換編譯器會報類型轉(zhuǎn)換異常(String類型無法轉(zhuǎn)換成Integert類型),使用valueof方法則可以通過編譯人柿,運行結(jié)果也是正確的柴墩;那么在試想一下,如果是 String a = "120.0";那會是怎么樣的結(jié)果呢凫岖。

拋出一個異常江咳,不能輸入字符串為“120.0”,a是浮點類型的哥放,那怎么辦歼指,總會有解決方法的爹土。

哎呦,好像行不通踩身,F(xiàn)loat精度比Integer高胀茵,嗯!強轉(zhuǎn)挟阻?

也不行琼娘,好像很絕望。Integer b = Float.valueOf(a).intValue();好像行了附鸽,測試一下脱拼。還真行,什么情況坷备,這個intValue又是個什么方法挪拟。/**

Returns the value of this {@code Float} as an {@code int} after

a narrowing primitive conversion.

@return the {@code float} value represented by this object

converted to type {@code int}

@jls 5.1.3 Narrowing Primitive Conversions

*/

public int intValue() {

return (int)value;

}

什么,居然是個強轉(zhuǎn)击你,搞了半天還是強轉(zhuǎn)玉组,那為啥我們那樣轉(zhuǎn)不行呢,因為我們是類強轉(zhuǎn)丁侄,而它是類型轉(zhuǎn)換惯雳。

挖槽還真可以,說明這就沒錯了鸿摇。

4)內(nèi)存使用

這次那long類型來舉例石景,因為這樣舉例會比較明顯,我們知道long類型是占8個字節(jié)(占用跟系統(tǒng)有關)拙吉,而Long包裝類呢潮孽,卻是一個對象。

Long start = System.currentTimeMillis();

Long l = 0L;

for (Integer i = 0; i < Integer.MAX_VALUE; i++){

l++;

}

System.out.println(System.currentTimeMillis() - start);

這段代碼會執(zhí)行多久呢筷黔,好像是一瞬間的事往史,可是他執(zhí)行了13060ms,可能這關系到機器佛舱,但是這個問題是很嚴重的椎例,如果不小心寫了這樣的代碼,搞蹦一個程序是很簡單的事情请祖。

這里每次執(zhí)行l(wèi)++操作其實都相當于創(chuàng)建了一個新的實例订歪,那這個量就非常大了,而如果換成基本數(shù)據(jù)類型的話肆捕,從始至終它都是8個字節(jié)刷晋。

我們修改一下程序

Long start = System.currentTimeMillis();

long l = 0L;

for (int i = 0; i < Integer.MAX_VALUE; i++){

l++;

}

System.out.println(System.currentTimeMillis() - start);

那么它的運行時間又是多少呢?78ms

是不是很驚訝,相差了好幾百倍眼虱,所以我們絕對不可以出現(xiàn)這樣的代碼或舞,對于基本數(shù)據(jù)類型還是包裝類的選擇,我們首選還是基本數(shù)據(jù)類型蒙幻,而當某些場景無法繼續(xù)使用基本數(shù)據(jù)類型時映凳,我們才使用包裝類進行處理。

OK邮破,到此為止诈豌,基本數(shù)據(jù)類型跟包裝類之間的關系和區(qū)別我就講完了,如果有講的不好或者是講得不對的地方大家一定要指出來抒和,不然我就沒法進步了矫渔!

?都看到這里了點個贊再走唄。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摧莽,一起剝皮案震驚了整個濱河市庙洼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镊辕,老刑警劉巖油够,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異征懈,居然都是意外死亡石咬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門卖哎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鬼悠,“玉大人,你說我怎么就攤上這事亏娜』牢眩” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵维贺,是天一觀的道長它掂。 經(jīng)常有香客問我,道長幸缕,這世上最難降的妖魔是什么群发? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮发乔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雪猪。我一直安慰自己栏尚,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布只恨。 她就那樣靜靜地躺著译仗,像睡著了一般抬虽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纵菌,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天阐污,我揣著相機與錄音,去河邊找鬼咱圆。 笑死笛辟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的序苏。 我是一名探鬼主播手幢,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忱详!你這毒婦竟也來了围来?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匈睁,失蹤者是張志新(化名)和其女友劉穎监透,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體航唆,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡才漆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了佛点。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醇滥。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖超营,靈堂內(nèi)的尸體忽然破棺而出鸳玩,到底是詐尸還是另有隱情,我是刑警寧澤演闭,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布不跟,位于F島的核電站,受9級特大地震影響米碰,放射性物質(zhì)發(fā)生泄漏窝革。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一吕座、第九天 我趴在偏房一處隱蔽的房頂上張望虐译。 院中可真熱鬧,春花似錦吴趴、人聲如沸漆诽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厢拭。三九已至兰英,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間供鸠,已是汗流浹背绰咽。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工摔癣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留引矩,地道東北人秕重。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像泡一,于是被迫代替她去往敵國和親颤殴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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