本文是我和xqnode聯合創作,已收錄至我們的GitHub,歡迎大家給個Star:https://github.com/nxJava/nx_java
我們會持續更新,歡迎監督!
微信搜索:武哥聊編程,關注這個Java菜鳥~
小故事
大家好,我是node哥哥,江湖人稱青哥,最近看那本很火的《Java從入門到入土》非常入迷,聽說在各大書城的銷量排行榜上穩居第一名?看來愛學習的小夥伴還是很多的呀!都說知識改變命運,Java成就人生,這麼看來我當初下定決心學習Java的選擇是多麼的正確!
不過話說回來,這本書寫的確實不錯,但畢竟我剛入門,有一些小知識點還有點疑惑,比如剛剛學習的數據類型,這對於零基礎的我來說還是有些難度的。
這天,我在CSDN上正無聊閒逛,看到一篇博客 【數據結構和算法05】 紅-黑樹 看完包懂~ 。說實話看到這樣的文章我是非常不屑的,紅黑樹?是什麼樹?怎麼一半紅一半黑的?看完包懂?萬一我懂一半呢?那不是難產了?哼!讓我來我看看你是什麼妖魔鬼怪。
小手輕輕一點,我進來了。一開始我是非常不以爲然的,可是,越往下,我越喫驚…兩分鐘後,我差點跪下了!這寫的太好了吧,怎麼感覺比書裏講的還詳細的多呢(雖然沒看懂)!看看這滿滿的乾貨,這清新脫俗的文字,這滿屏幕的【知識】,我怎麼忍心錯過呢?還不讓他趕緊去我的收藏夾喫灰?看我關注、點贊、收藏,一波三連,把大佬安排的明明白白。
懷着激動的心情,我悄悄點開大佬的對話框。
我:大佬,在嗎?
過了一小會,大佬居然回信了!
武哥:在~ 有什麼事嗎?
我:(不知道怎麼組織語言)額…大佬…你真帥!太牛x了!
武哥:害!這不是公認的嗎?
我:(一腦門黑線,敢情這大佬有點自戀啊,我只是商業吹捧一下,他還挺自居?)哈哈~大佬,是這樣的,我是一個學習Java的小白白,請問你能帶帶我嗎?
武哥:嗯…這個…帶可以,我收費的哦
我:(心想果然是大佬,還收費)大佬,我非常喜歡Java,最近還買了一本書學習,書名是《Java從入門到入土》,我感覺這本書挺好,就是我有點小疑惑,想請教下學習的小問題,你看能不能開個後門?
武哥:那…行吧。看在你這麼好學的份上,我就給你指點指點,你現在學到哪裏了?
我:我剛學到Java基礎呢,看到數據結構這地方有點小懵圈~
武哥:這好說,我當年學Java基礎可足足花了大半年呢!基礎非常紮實的哦,我可以帶着你一起過一下這塊的知識點。
我:真的嗎?大佬!那太感謝你了!回頭我請你喫飯!
武哥:小問題,小問題。我看你在也在合肥?
我:是呀~(有點慌,悄悄點開大佬的個人資料,莫非…)
武哥:哈哈,巧了!我也在呢!
我:啊哈?這麼巧?那要不…(看了一頓飯跑不掉了,我哭…)
武哥:你加我個微信,我給你發個定位,咱們細聊。
我:(這就…面基了?才幾分鐘的交流?大佬都這麼騷的嗎?雖然心裏不太願意,但是身體卻很誠實)emm…好的,我這就過去…
武哥:好,等你哦~
我打了一個激靈…內心有一絲絲的慌張!
半小時後,我按照武哥給的地址,打車過來了。
見到武哥,果然,不出我所料,騷氣異常!
只見武哥梳一個大背頭,還抹了點油,斜靠在車上45°仰望天空,點一根菸,帶着無盡的滄桑和寂寞。
我:(硬着頭皮上去打了個招呼)武哥?
武哥:(停下抽菸的動作,看了我一眼,眼神帶着一絲迷離):Hello?你是node小哥哥嗎?
我:嗯…是的(悄悄後退幾步)
武哥:(大步走過來,一把摟住我的肩膀)走,我們去咖啡店裏,喝杯咖啡,聊聊Java,如何?
我:(心想你都這樣了,我還拒絕個屁啊!)好…的…
於是,武哥摟着我扭扭捏捏得去了星巴克…然後找了一個安靜的小包間…
接下來的一幕估計你們能猜到了…
咳咳!正經點!我們是討論學習去的!
什麼?你不信?
那你就往下看看,乾貨預警!
乾貨來了
Java 數據類型有很多,本文主要從基本類型、包裝類型、引用類型和緩存池四個方面來總結。
基本數據類型
基本數據類型有 byte、short、int、long、float、double、boolean、char,關於它們的分類,我畫了個圖。
接下來我主要從字節數、數據範圍、默認值、以及用途等方面給大家總結成一個表格,一目瞭然。
數據類型 | 字節數 | 位數 | 最小值 | 最大值 | 默認值 | 用途 |
---|---|---|---|---|---|---|
byte | 1 | 8 | -128 | 127 | 0 | byte 類型用在大型數組中節約空間,主要代替整數。因爲 byte 變量佔用的空間只有 int 類型的四分之一 |
short | 2 | 16 | -32768 | 32767 | 0 | Short 數據類型也可以像 byte 那樣節省空間。一個short變量是int型變量所佔空間的二分之一 |
int | 4 | 32 | -2^31 | 2^31 - 1 | 0 | 一般地整型變量默認爲 int 類型 |
long | 8 | 64 | -2^63 | 2^63-1 | 0L | 這種類型主要使用在需要比較大整數的系統上 |
float | 4 | 32 | 1.4e-45 | 3.4e38 | 0.0F | float 在儲存大型浮點數組的時候可節省內存空間。浮點數不能用來表示精確的值,如貨幣 |
double | 8 | 64 | 4.9e-324 | 1.8e308 | 0.0D | 浮點數的默認類型爲double類型。double類型同樣不能表示精確的值,如貨幣 |
boolean | × | × | × | × | false | true和false |
char | 2 | 16 | \u0000 | \uffff | char 數據類型可以儲存任何字符 |
包裝數據類型
上面提到的基本類型都有對應的包裝類型,爲了方便讀者查看,我也整了一個表格。
基本類型 | 包裝類型 | 最小值 | 最大值 |
---|---|---|---|
byte | Byte | Byte.MIN_VALUE |
Byte.MAX_VALUE |
short | Short | Short.MIN_VALUE |
Short.MAX_VALUE |
int | Integer | Integer.MIN_VALUE |
Integer.MAX_VALUE |
long | Long | Long.MIN_VALUE |
Long.MAX_VALUE |
float | Float | Float.MIN_VALUE |
Float.MAX_VALUE |
double | Double | Double.MIN_VALUE |
Double.MAX_VALUE |
boolean | Boolean | Boolean.MIN_VALUE |
Boolean.MAX_VALUE |
char | Char | Char.MIN_VALUE |
Char.MAX_VALUE |
引用類型
在Java中,引用類型的變量非常類似於 C/C++ 的指針。引用類型指向一個對象,指向對象的變量是引用變量。這些變量在聲明時被指定爲一個特定的類型,比如 Student、Dog 等。變量一旦聲明後,類型就不能被改變了。
對象、數組都是引用數據類型。所有引用類型的默認值都是null。一個引用變量可以用來引用任何與之兼容的類型。例如:
Dog dog = new Dog("旺財")。
數據類型轉換
包裝類型和基本類型之間如何轉化呢?
Integer x = 2; // 裝箱 調用了 Integer.valueOf(2)
int y = x; // 拆箱 調用了 X.intValue()
基本類型之間如何轉換呢?有兩個點:
- 把大容量的類型轉換爲小容量的類型時必須使用強制類型轉換。
- 把小容量的類型轉換爲大容量的類型可以自動轉換。
比如:
int i =128;
byte b = (byte)i;
long c = i;
緩存池
大家思考一個問題:new Integer(123)
與Integer.valueOf(123)
有什麼區別?
有些人可能知道,有些人可能不知道。其實他們的區別很大。
- new Integer(123) 每次都會新建一個對象;
- Integer.valueOf(123) 會使用緩存池中的對象,多次調用會取得同一個對象的引用。
我寫個demo大家就知道了
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k); // true
編譯器會在自動裝箱過程調用valueOf()
方法,因此多個值相同且值在緩存池範圍內的 Integer 實例使用自動裝箱來創建,那麼就會引用相同的對象。如:
Integer m = 123;
Integer n = 123;
System.out.println(m == n); // true
valueOf()
方法的實現比較簡單,就是先判斷值是否在緩存池中,如果在的話就直接返回緩存池的內容。我們看下源碼就知道。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
根據數據類型的不一樣,這個緩存池的上下限也不同,比如這個 Integer,就是 -128~127。不過這個上界是可調的,在啓動 jvm 的時候,通過 -XX:AutoBoxCacheMax= 來指定這個緩衝池的大小,該選項在 JVM 初始化的時候會設定一個名爲 java.lang.IntegerCache.high 系統屬性,然後 IntegerCache 初始化的時候就會讀取該系統屬性來決定上界。
參考自:StackOverflow : Differences between new Integer(123), Integer.valueOf(123) and just 123
OK,武哥關於Java數據類型的小知識就分享到這了,雖然我還有點意猶未盡…
Java 的數據類型雖然簡單,但是裏面還是有很多小細節值得我們玩味的,希望這篇文章能給大家帶來一些幫助。
如果覺得有幫助,希望老鐵們來個三連擊,給更多的人看到這篇文章
1、關注我的原創微信公衆號「武哥聊編程」,專注於Java、數據結構和算法、微服務、中間件等技術分享,保證你看完有所收穫。
2、給俺點個贊唄,可以讓更多的人看到這篇文章,順便激勵下我繼續寫作,嘻嘻。
作者info
【作者】:武哥
【公衆號】:武哥聊編程。歡迎大家關注~
【作者簡介】:同濟大學,碩士。先後在華爲、科大訊飛、拼多多采坑。一個自學 Java 的菜鳥,期待你的關注。
點贊是對我最大的鼓勵
↓↓↓↓↓↓