你不知道的基本數(shù)據(jù)類型和包裝類

基本數(shù)據(jù)類型

Java 基本數(shù)據(jù)按類型可以分為四大類:布爾型膝但、整數(shù)型、浮點型汗销、字符型,這四大類包含 8 種基本數(shù)據(jù)類型抵窒。

布爾型:boolean

整數(shù)型:byte弛针、short、int李皇、long

浮點型:float削茁、double

字符型:char

8 種基本類型取值如下:

數(shù)據(jù)類型代表含義默認值取值包裝類

boolean布爾型false0(false) 到 1(true)Boolean

byte字節(jié)型(byte)0﹣128 到 127Byte

char字符型'\u0000'(空)'\u0000' 到 '\uFFFF'Character

short短整數(shù)型(short)0-215215 到 215215

﹣1Short

int整數(shù)型0﹣231231 到 231231﹣1Integer

long長整數(shù)型0L﹣263263 到 263263﹣1Long

float單浮點型0.0f1.4e-45 到 3.4e+38Float

double雙浮點型0.0d4.9e-324 到 1.798e+308Double

除 char 的包裝類 Character 和 int 的包裝類 Integer 之外,其他基本數(shù)據(jù)類型的包裝類只需要首字母大寫即可掉房。包裝類的作用和特點茧跋,本文下半部分詳細講解。

我們可以在代碼中卓囚,查看某種類型的取值范圍瘾杭,代碼如下:

public static void main(String[] args) {

?? // Byte 取值:-128 ~ 127

?? System.out.println(String.format("Byte 取值:%d ~ %d", Byte.MIN_VALUE, Byte.MAX_VALUE));

?? // Int 取值:-2147483648 ~ 2147483647

?? System.out.println(String.format("Int 取值:%d ~ %d", Integer.MIN_VALUE, Integer.MAX_VALUE));

}

包裝類型

我們知道 8 種基本數(shù)據(jù)類型都有其對應的包裝類,因為 Java 的設計思想是萬物既對象哪亿,有很多時候我們需要以對象的形式操作某項功能富寿,比如說獲取哈希值(hashCode)或獲取類(getClass)等。

那包裝類特性有哪些锣夹?

1. 功能豐富

包裝類本質(zhì)上是一個對象,對象就包含有屬性和方法苏潜,比如 hashCode银萍、getClass 、max恤左、min 等贴唇。

2. 可定義泛型類型參數(shù)

包裝類可以定義泛型,而基本類型不行飞袋。

比如使用 Integer 定義泛型戳气,代碼:

List<Integer> list = new ArrayList<>();

如果使用 int 定義就會報錯,代碼:

List list = new ArrayList<>();? // 編譯器代碼報錯

3. 序列化

因為包裝類都實現(xiàn)了 Serializable 接口巧鸭,所以包裝類天然支持序列化和反序列化瓶您。比如 Integer 的類圖如下:

4. 類型轉換

包裝類提供了類型轉換的方法,可以很方便的實現(xiàn)類型之間的轉換,比如 Integer 類型轉換代碼:

String age = "18";

int ageInt = Integer.parseInt(age) + 2;

// 輸出結果:20

System.out.println(ageInt);

5. 高頻區(qū)間的數(shù)據(jù)緩存

此特性為包裝類很重要的用途之一呀袱,用于高頻區(qū)間的數(shù)據(jù)緩存贸毕,以 Integer 為例來說,在數(shù)值區(qū)間為 -128~127 時夜赵,會直接復用已有對象明棍,在這區(qū)間之外的數(shù)字才會在堆上產(chǎn)生。

我們使用 == 對 Integer 進行驗證寇僧,代碼如下:

public static void main(String[] args) {

? ? ?? // Integer 高頻區(qū)緩存范圍 -128~127

? ? ?? Integer num1 = 127;

? ? ?? Integer num2 = 127;

? ? ?? // Integer 取值 127 == 結果為 true(值127 num1==num2 => true)

? ? ?? System.out.println("值127 num1==num2 => " + (num1 == num2));

? ? ?? Integer num3 = 128;

? ? ?? Integer num4 = 128;

? ? ?? // Integer 取值 128 == 結果為 false(值128 num3==num4 => false)

? ? ?? System.out.println("值128 num3==num4 => " + (num3 == num4));

?? }

從上面的代碼很明顯可以看出摊腋,Integer 為 127 時復用了已有對象,當值為 128 時嘁傀,重新在堆上生成了新對象兴蒸。

為什么會產(chǎn)生高頻區(qū)域數(shù)據(jù)緩存?我們查看源碼就能發(fā)現(xiàn)“線索”心包,源碼版本 JDK8类咧,源碼如下:

public static Integer valueOf(int i) {

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

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

? return new Integer(i);

}

由此可見,高頻區(qū)域的數(shù)值會直接使用已有對象蟹腾,非高頻區(qū)域的數(shù)值會重新 new 一個新的對象痕惋。

各包裝類高頻區(qū)域的取值范圍:

Boolean:使用靜態(tài) final 定義,就會返回靜態(tài)值

Byte:緩存區(qū) -128~127

Short:緩存區(qū) -128~127

Character:緩存區(qū) 0~127

Long:緩存區(qū) -128~127

Integer:緩存區(qū) -128~127

包裝類的注意事項

int 的默認值是 0娃殖,而 Integer 的默認值是 null值戳。

推薦所有包裝類對象之間的值比較使用 equals() 方法,因為包裝類的非高頻區(qū)數(shù)據(jù)會在堆上產(chǎn)生炉爆,而高頻區(qū)又會復用已有對象堕虹,這樣會導致同樣的代碼,因為取值的不同芬首,而產(chǎn)生兩種截然不同的結果赴捞。代碼示例:

public static void main(String[] args) {

?? // Integer 高頻區(qū)緩存范圍 -128~127

?? Integer num1 = 127;

?? Integer num2 = 127;

?? // Integer 取值 127 == 結果為 true(值127 num1==num2 => true)

?? System.out.println("值127 num1==num2 => " + (num1 == num2));

?? Integer num3 = 128;

?? Integer num4 = 128;

?? // Integer 取值 128 == 結果為 false(值128 num3==num4 => false)

?? System.out.println("值128 num3==num4 => " + (num3 == num4));

?? // Integer 取值 128 equals 結果為 true(值128 num3.equals(num4) => true)

?? System.out.println("值128 num3.equals(num4) => " + num3.equals(num4));

}

Float 和 Double 不會有緩存,其他包裝類都有緩存郁稍。

Integer 是唯一一個可以修改緩存范圍的包裝類赦政,在 VM optons 加入?yún)?shù):

-XX:AutoBoxCacheMax=666 即修改緩存最大值為 666 。

示例代碼如下:

public static void main(String[] args) {

?? Integer num1 = -128;

?? Integer num2 = -128;

?? System.out.println("值為-128 => " + (num1 == num2));

?? Integer num3 = 666;

?? Integer num4 = 666;

?? System.out.println("值為666 => " + (num3 == num4));

?? Integer num5 = 667;

?? Integer num6 = 667;

?? System.out.println("值為667 => " + (num5 == num6));

}

執(zhí)行結果如下:

值為-128 => true

值為666 => true

值為667 => false

由此可見將 Integer 最大緩存修改為 666 之后耀怜,667 不會被緩存恢着,而 -128~666 之間的數(shù)都被緩存了。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末财破,一起剝皮案震驚了整個濱河市掰派,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌左痢,老刑警劉巖靡羡,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件系洛,死亡現(xiàn)場離奇詭異,居然都是意外死亡亿眠,警方通過查閱死者的電腦和手機碎罚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纳像,“玉大人荆烈,你說我怎么就攤上這事【怪海” “怎么了憔购?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岔帽。 經(jīng)常有香客問我玫鸟,道長,這世上最難降的妖魔是什么犀勒? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任屎飘,我火速辦了婚禮,結果婚禮上贾费,老公的妹妹穿的比我還像新娘钦购。我一直安慰自己,他們只是感情好褂萧,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布押桃。 她就那樣靜靜地躺著,像睡著了一般导犹。 火紅的嫁衣襯著肌膚如雪唱凯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天谎痢,我揣著相機與錄音磕昼,去河邊找鬼。 笑死节猿,一個胖子當著我的面吹牛掰烟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沐批,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝎亚!你這毒婦竟也來了九孩?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤发框,失蹤者是張志新(化名)和其女友劉穎躺彬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡宪拥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年仿野,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片她君。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡脚作,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缔刹,到底是詐尸還是另有隱情球涛,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布校镐,位于F島的核電站亿扁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸟廓。R本人自食惡果不足惜从祝,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望引谜。 院中可真熱鬧牍陌,春花似錦、人聲如沸煌张。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骏融。三九已至链嘀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間档玻,已是汗流浹背怀泊。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留误趴,地道東北人霹琼。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像凉当,于是被迫代替她去往敵國和親枣申。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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

  • 第01章 JAVA簡介第02章 基礎語法第02章 遞歸補充第03章 面向對象第04章 異常處理第05章 數(shù)組第06...
    順毛閱讀 516評論 0 1
  • 包裝類(包裹類 Wrapper) : 定義Java 針對八種 基本數(shù)據(jù)類型 提供了相應的包裝類 目的使得可以創(chuàng)建對...
    Finlay_Li閱讀 289評論 0 0
  • 其他更多java基礎文章:java基礎學習(目錄) 轉載自 Java 源碼學習系列(三)——Integer學習的過...
    Hiwayz閱讀 715評論 0 0
  • Go語言數(shù)據(jù)類型 Go語言本質(zhì)是用C語言編寫的一套高級開發(fā)語言, 所以Go語言中的數(shù)據(jù)類型大部分都是由C語言演變而...
    極客江南閱讀 927評論 0 6
  • 我市天龍汽車站的站長。前幾天下去檢查工作時楼雹。我發(fā)現(xiàn)乘客上車時比較擁擠模孩,尤其是那些抱著小孩兒又踢東西的婦女上車尖阔。非常...
    張嘉鑫1閱讀 140評論 0 0