深入理解www6662016comJava 基本I8O883559II數據類型

數據類型分類

Java 中的數據類型有兩類:

值類型(又叫內置數據類型,基本數據類型)
引用類型(除值類型以外,都是引用類型,包括 String、數組)
值類型

Java 語言提供了 8 種基本類型,大致分爲 4 類

整數型byte - 8 位。
short - 16 位。
int - 32 位。
long - 64 位,賦值時一般在數字後加上 l 或 L。
浮點型float - 32 位,直接賦值時必須在數字後加上 f 或 F。
double - 64 位,賦值時一般在數字後加 d 或 D 。
字符型char - 16 位,存儲 Unicode 碼,用單引號賦值。
布爾型boolean - 只有 true 和 false 兩個取值。
值類型和引用類型的區別

從概念方面來說
基本類型:變量名指向具體的數值。
引用類型:變量名指向存數據對象的內存地址。
從內存方面來說
基本類型:變量在聲明之後,Java 就會立刻分配給他內存空間。
引用類型:它以特殊的方式(類似 C 指針)向對象實體(具體的值),這類變量聲明時不會分配內存,只是存儲了一個內存地址。
從使用方面來說
基本類型:使用時需要賦具體值,判斷時使用 == 號。
引用類型:使用時可以賦 null,判斷時使用 equals 方法。
:point_right: 擴展閱讀:Java 基本數據類型和引用類型

數據轉換

Java 中,數據類型轉換有兩種方式:

自動換行
強制轉換
自動轉換

一般情況下,定義了某數據類型的變量,就不能再隨意轉換。但是 JAVA 允許用戶對基本類型做有限度的類型轉換。

如果符合以下條件,則 JAVA 將會自動做類型轉換:

由小數據轉換爲大數據
顯而易見的是,“小”數據類型的數值表示範圍小於“大”數據類型的數值表示範圍,即精度小於“大”數據類型。
所以,如果“大”數據向“小”數據轉換,會丟失數據精度。比如:long 轉爲 int,則超出 int 表示範圍的數據將會丟失,導致結果的不確定性。
反之,“小”數據向“大”數據轉換,則不會存在數據丟失情況。由於這個原因,這種類型轉換也稱爲擴大轉換。
這些類型由“小”到“大”分別爲:(byte,short,char) < int < long < float < double。
這裏我們所說的“大”與“小”,並不是指佔用字節的多少,而是指表示值的範圍的大小。
轉換前後的數據類型要兼容
由於 boolean 類型只能存放 true 或 false,這與整數或字符是不兼容的,因此不可以做類型轉換。
整型類型和浮點型進行計算後,結果會轉爲浮點類型
示例:

long x = 30;
float y = 14.3f;
System.out.println("x/y = " + x/y);
輸出:

x/y = 1.9607843
可見 long 雖然精度大於 float 類型,但是結果爲浮點數類型。

強制轉換

在不符合自動轉換條件時或者根據用戶的需要,可以對數據類型做強制的轉換。

強制轉換使用括號 () 。

引用類型也可以使用強制轉換。

示例:

float f = 25.5f;
int x = (int)f;
System.out.println("x = " + x);
裝箱和拆箱

包裝類、裝箱、拆箱

Java 中爲每一種基本數據類型提供了相應的包裝類,如下:

Byte <-> byte
Short <-> short
Integer <-> int
Long <-> long
Float <-> float
Double <-> double
Character <-> char
Boolean <-> boolean
引入包裝類的目的就是:提供一種機制,使得基本數據類型可以與引用類型互相轉換。

基本數據類型與包裝類的轉換被稱爲裝箱和拆箱。

裝箱(boxing)是將值類型轉換爲引用類型。例如:int 轉 Integer裝箱過程是通過調用包裝類的 valueOf 方法實現的。
拆箱(unboxing)是將引用類型轉換爲值類型。例如:Integer 轉 int拆箱過程是通過調用包裝類的 xxxValue 方法實現的。(xxx 代表對應的基本數據類型)。
自動裝箱、自動拆箱

基本數據(Primitive)型的自動裝箱(boxing)拆箱(unboxing)自 JDK 5 開始提供的功能。

JDK 5 之前的形式:

Integer i1 = new Integer(10); // 非自動裝箱
JDK 5 之後:

Integer i2 = 10; // 自動裝箱
Java 對於自動裝箱和拆箱的設計,依賴於一種叫做享元模式的設計模式(有興趣的朋友可以去了解一下源碼,這裏不對設計模式展開詳述)。

裝箱、拆箱的應用和注意點

裝箱、拆箱應用場景

一種最普通的場景是:調用一個含類型爲 Object 參數的方法,該 Object 可支持任意類型(因爲 Object 是所有類的父類),以便通用。當你需要將一個值類型(如 int)傳入時,需要使用 Integer 裝箱。
另一種用法是:一個非泛型的容器,同樣是爲了保證通用,而將元素類型定義爲 Object。於是,要將值類型數據加入容器時,需要裝箱。
當 == 運算符的兩個操作,一個操作數是包裝類,另一個操作數是表達式(即包含算術運算)則比較的是數值(即會觸發自動拆箱的過程)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章