Java數(shù)據(jù)類型(八種基本數(shù)據(jù)類型+四種引用類型)以及數(shù)據(jù)類型轉(zhuǎn)換
1.總覽
- Java的數(shù)據(jù)類型只有兩大類:8大基本數(shù)據(jù)類型與引用數(shù)據(jù)類型。其中基本數(shù)據(jù)類型又被稱為值類型
- 基本數(shù)據(jù)類型:6種數(shù)字類型(byte/short/int/long/float/double)、1種字符型(char)、1種布爾型(boolean)
- 引用數(shù)據(jù)類型:類(Class)、接口(Interface)、數(shù)組(Array)
- 除了以上的基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,還有一些其他相關(guān)的數(shù)據(jù)類型,例如字符串類型String、枚舉類型Enum,它們都是基于引用數(shù)據(jù)類型來實現(xiàn)的
- 基本數(shù)據(jù)類型只能存自己類型的值,無其他額外功能,具體介紹如下第2小節(jié)
- 引用類型:參數(shù)傳遞時,以拷貝引用地址的方式傳遞給接收變量,而非復制整個數(shù)據(jù)本體。除八大基本數(shù)據(jù)類型之外的所有數(shù)據(jù)類型,都為引用數(shù)據(jù)類型。所有引用數(shù)據(jù)類型的默認值都為null。
- 為了基本數(shù)據(jù)類型可以與引用數(shù)據(jù)類型互相轉(zhuǎn)換、以利用彼此的特性,java為每一種基本數(shù)據(jù)類型提供了相應(yīng)的包裝類。包裝類對基本數(shù)據(jù)類型進行了封裝,提供了豐富的功能,包裝類是基本類型的拓展
- 包裝類是引用類型的一種,包裝類與基本數(shù)據(jù)類型一一對應(yīng),也有8種,分別為:Byte、Short、Integer、Long、Float、Double、Character、Boolean
2.基本數(shù)據(jù)類型
2.1 類型概述
6種數(shù)字類型
- 4種整數(shù)型:byte、short、int、long
- 2種浮點型:float、double
1種字符類型:char
1種布爾型:boolean
2.2 基本數(shù)據(jù)類型詳解
| 基本類型 | 存儲大小 | 初始化默認值 | 取值范圍 | 包裝類型 |
|---|---|---|---|---|
| byte | 1字節(jié)(8位) | 0 | -128~127 | Byte |
| short | 2字節(jié)(16位) | 0 | -32768~32767 | Short |
| int | 4字節(jié)(32位) | 0 | -2^31 ~ 2^31 - 1 | Integer |
| long | 8字節(jié)(64位) | 0L。"L"理論上不分大小寫,但若寫成"l"容易與數(shù)字"1"混淆,不容易分辨,所以最好大寫。 | -2^63 ~ 2^63 - 1 | Long |
| float | 4字節(jié)(32位) | 0.0f | 符合IEEE754標準的浮點數(shù),1.4E-45 ~ 3.4028235E38 | Float |
| double | 8字節(jié)(64位) | 0.0d | 符合IEEE754標準的浮點數(shù),4.9E-324 ~ 1.7976931348623157E308 | Double |
| char | 2字節(jié)(16位) | ‘\u0000’ | \u0000 ~ \uffff(十進制等效值為 0~65535,本質(zhì)也是數(shù)值) | Character |
| boolean | 1字節(jié)(8位)/4字節(jié)(32位) | false | true/false | Boolean |
char 數(shù)據(jù)類型可以儲存任何字符。
float、double不能用來表示精確的值,運算不精確——>解決方案:BigDecimal。創(chuàng)建BigDecimal對象的方式:
- BigDecimal(double val) : double類型的數(shù)據(jù)作為參數(shù),交給BigDecimal對象【不用,因為double本身不精確】
- BigDecimal(String val) : String類型的數(shù)據(jù)作為參數(shù),交給BigDecimal對象【用這個】
注:double->String 直接拼接一個字符串""就行。
對于數(shù)值類型的基本類型的取值范圍,我們無需強制去記憶,因為它們的值都已經(jīng)以常量的形式定義在對應(yīng)的包裝類中
//long
System.out.println("基本類型:long 二進制位數(shù):" + Long.SIZE);
System.out.println("包裝類:java.lang.Long");
System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();
//double
System.out.println("基本類型:double 二進制位數(shù):" + Double.SIZE);
System.out.println("包裝類:java.lang.Double");
System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();
//其他類型方法同上類似
2.3 基本數(shù)據(jù)類型與引用數(shù)據(jù)類型區(qū)別
- 存儲方式:基本數(shù)據(jù)類型直接存儲值,而引用數(shù)據(jù)類型存儲的是對象的引用(內(nèi)存地址)
- 內(nèi)存分配:基本數(shù)據(jù)類型在棧上分配內(nèi)存,引用數(shù)據(jù)類型在堆上分配內(nèi)存(具體內(nèi)容存放在堆中,棧中存放的是其具體內(nèi)容所在內(nèi)存的地址)。棧上的分配速度較快,但是內(nèi)存空間較小,而堆上的分配速度較慢,但可以分配更大的內(nèi)存空間
- 默認值:基本數(shù)據(jù)類型會有默認值,例如int類型的默認值是0,boolean類型的默認值是false。而引用數(shù)據(jù)類型的默認值是null,表示沒有引用指向任何對象
- 復制操作:基本數(shù)據(jù)類型進行復制時,會復制該變量的值。而引用數(shù)據(jù)類型進行復制時,只會復制對象的引用,兩個變量指向同一個對象
- 參數(shù)傳遞:基本數(shù)據(jù)類型作為方法的參數(shù)傳遞時,傳遞的是值的副本,不會修改原始值。而引用數(shù)據(jù)類型作為方法的參數(shù)傳遞時,傳遞的是對象的引用,可以修改對象的屬性或狀態(tài)
- 比較操作:基本數(shù)據(jù)類型使用==進行比較時,比較的是值是否相等。而引用數(shù)據(jù)類型使用==進行比較時,比較的是引用是否指向同一個對象,如果要比較對象的內(nèi)容是否相同,需要使用equals()方法
注意:Java中的包裝類(Wrapper Classes)對基本數(shù)據(jù)類型進行了封裝,使其也具有了對象的特性,可以調(diào)用方法和進行類型轉(zhuǎn)換等操作。

2.4 基本數(shù)據(jù)類型與包裝類區(qū)別
- 存儲方式:基本類型直接存儲值,而包裝類型存儲的是對應(yīng)基本類型值的對象。
- 空值處理:基本類型沒有空值(null)的概念,而包裝類型可以將null作為有效值來表示缺失或無效值。
- 默認值:基本類型有默認值,例如int類型的默認值是0,boolean類型的默認值是false。而包裝類型的默認值是null。
- 對象操作:基本類型不能直接調(diào)用方法,而包裝類型可以調(diào)用對應(yīng)的方法,例如Integer類的intValue()方法可以獲取保存在Integer對象中的值。
- 自動裝箱/拆箱:基本類型和包裝類型之間可以進行自動裝箱和拆箱的轉(zhuǎn)換。自動裝箱是指將基本類型的值自動轉(zhuǎn)換為對應(yīng)的包裝類型對象,如int 轉(zhuǎn)Integer,Integer integer = 100,底層調(diào)用了Interger.valueOf(100)方法;而自動拆箱則是將包裝類型對象自動轉(zhuǎn)換為基本類型的值。
- 泛型支持:泛型只能使用引用類型,不能直接使用基本類型。因此,當需要在泛型中使用基本類型時,需要使用對應(yīng)的包裝類型。
- 比較方式:基本類型使用==進行比較時,比較的是值是否相等。而包裝類型使用==進行比較時,比較的是引用是否指向同一個對象,而不是比較值是否相等。若要比較包裝類型的值是否相等,需要使用equals()方法。
注意:在Java 5及其之后的版本中,基本類型和包裝類型之間的轉(zhuǎn)換會通過自動裝箱、拆箱來自動進行,使得基本類型和包裝類型之間的使用更加方便
補充:
包裝類Integer的創(chuàng)建方式
1)Integer i1 = new Integer(3); 沒有高效的效果,new一次,創(chuàng)建一個包裝類對象
2)Integer i2 = Integer.valueOf(3); 有高效的效果,數(shù)據(jù)在-128~127的范圍內(nèi),才有高效的效果
3)Integer i3 = 3; 自動裝箱:編譯器會把int類型5裝箱,變成Integer,底層調(diào)用Integer.valueOf(5)方法
包裝類Double的創(chuàng)建方式
1)Double d1 = new Double(2.7); 沒有高效的效果,new一次,創(chuàng)建一個包裝類對象
2)Double d2 = Double.valueOf(2.7);這個也沒有高效的效果,只有Integer有
自動裝箱與自動拆箱
Integer aInteger = 100; 自動裝箱【編譯器會將int類型的100裝箱,變成Interger類型,底層調(diào)用 Interger.valueOf(100) 方法】
int a = aInteger; 自動拆箱【編譯器會將包裝類型aInteger中的數(shù)據(jù)取出來,賦值給a,底層調(diào)用 aInteger.intValue() 方法】
String轉(zhuǎn)Integer、int、Double、double
String str1 = "7"; Integer m = Integer.valueOf(str1); int n = Integer.parseInt(str1); String str2 = "5.4"; Double d2 = Double.valueOf(str2); double d3 = Double.parseDouble(str2); //輸出 7, 7, 5.4, 5.4 System.out.println(m + ", " + n + ", " + d2 + ", " + d3);
3.數(shù)據(jù)類型轉(zhuǎn)換
Java中的數(shù)據(jù)轉(zhuǎn)換主要分為兩種:自動類型轉(zhuǎn)換(也稱為隱式轉(zhuǎn)換)、強制類型轉(zhuǎn)換(也稱為顯式轉(zhuǎn)換)。
轉(zhuǎn)換從低級到高級:byte、short、char(三者同級)——> int ——> long ——> float ——> double
- 自動類型轉(zhuǎn)換:代碼無需任何處理,在代碼編譯時 編譯器會自動進行處理。特點——低級轉(zhuǎn)換高級。
- 強制類型轉(zhuǎn)換:需要在待轉(zhuǎn)換數(shù)據(jù)類型前 使用 (type)value, type是要強制類型轉(zhuǎn)換后的數(shù)據(jù)類型,可能會導致溢出或損失精度 。特點——高級轉(zhuǎn)換低級。
數(shù)據(jù)類型轉(zhuǎn)換必須滿足如下規(guī)則:
不能對boolean類型進行類型轉(zhuǎn)換。
不能把對象類型轉(zhuǎn)換成不相關(guān)類的對象。
在把容量大的類型轉(zhuǎn)換為容量小的類型時必須使用強制類型轉(zhuǎn)換。
轉(zhuǎn)換過程中可能導致溢出或損失精度,例如:
int i =128; byte b = (byte)i;
因為 byte 類型是 8 位,最大值為127,所以當 int 強制轉(zhuǎn)換為 byte 類型時,值 128 時候就會導致溢出。
浮點數(shù)到整數(shù)的轉(zhuǎn)換是通過舍棄小數(shù)得到,而不是四舍五入,例如:
(int)23.7 == 23; (int)-45.89f == -45;
3.1 具體示例
int 和 long 互轉(zhuǎn)、int和double互轉(zhuǎn)、int和byte互轉(zhuǎn)、int和char互轉(zhuǎn)、int和String互轉(zhuǎn)
public static void main(String[] args) {
int aInt = 20;
long bLong = 50L;
double cDouble = 4.8;
//低優(yōu)先級類型數(shù)據(jù) + 高優(yōu)先級類型數(shù)據(jù) ——> 結(jié)果會自動轉(zhuǎn)換為高優(yōu)先級數(shù)據(jù)
long sum = aInt + bLong;
//long -> int 需要強制類型轉(zhuǎn)換
int d = (int) bLong;
//double -> int 需要強制類型轉(zhuǎn)換
int e = (int) cDouble;
System.out.println("自動類型轉(zhuǎn)換 int—>long: " + sum);
System.out.println("強制類型轉(zhuǎn)換 long—>int: " + d);
System.out.println("強制類型轉(zhuǎn)換 double—>int: " + e);
System.out.println();
//int 和 byte 轉(zhuǎn)換
byte fByte = (byte) aInt; //高轉(zhuǎn)低,強轉(zhuǎn)
int gInt = fByte; //低轉(zhuǎn)高,自動
System.out.println("高轉(zhuǎn)低-強轉(zhuǎn),int->byte: " + fByte);
System.out.println("低轉(zhuǎn)高-自動,byte->int: " + gInt);
System.out.println();
//int 和 char 轉(zhuǎn)換
char hChar = 'a';
int iInt = hChar;
char j = (char) iInt;
System.out.println("低轉(zhuǎn)高-自動,char->int: " + iInt);
System.out.println("高轉(zhuǎn)低-強轉(zhuǎn),int->char: " + j);
System.out.println();
//int 和 String 轉(zhuǎn)換
//int轉(zhuǎn)String: 1)使用String的ValueOf方法 2)直接使用 String類+ (即字符串拼接),任意字符串和其他類型"+" 都會把其他類型轉(zhuǎn)為字符串
String str1 = String.valueOf(aInt);
String str2 = "" + aInt;
System.out.println("int轉(zhuǎn)String: " + str1 + ", " + str2);
//String轉(zhuǎn)int:調(diào)用包裝類的Integer.parseInt方法,當字符串中包含非數(shù)字時會出錯
String str3 = "18";
int k = Integer.parseInt(str3);
System.out.println("String轉(zhuǎn)int: " + k);
System.out.println();
//byte 和 char 互轉(zhuǎn)
byte m = (byte) hChar;
char n = (char) m;
System.out.println("char->byte,強轉(zhuǎn): " + m);
System.out.println("byte->char,強轉(zhuǎn): " + n);
}
輸出:
自動類型轉(zhuǎn)換 int—>long: 70
強制類型轉(zhuǎn)換 long—>int: 50
強制類型轉(zhuǎn)換 double—>int: 4高轉(zhuǎn)低-強轉(zhuǎn),int->byte: 20
低轉(zhuǎn)高-自動,byte->int: 20低轉(zhuǎn)高-自動,char->int: 97
高轉(zhuǎn)低-強轉(zhuǎn),int->char: aint轉(zhuǎn)String: 20, 20
String轉(zhuǎn)int: 18char->byte,強轉(zhuǎn): 97
byte->char,強轉(zhuǎn): a
總結(jié)
到此這篇關(guān)于Java數(shù)據(jù)類型(八種基本數(shù)據(jù)類型+四種引用類型)以及數(shù)據(jù)類型轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Java數(shù)據(jù)類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java操作XML轉(zhuǎn)JSON數(shù)據(jù)格式詳細代碼實例
在Java中我們可以使用一些現(xiàn)成的庫來實現(xiàn)XML到JSON的轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Java操作XML轉(zhuǎn)JSON數(shù)據(jù)格式的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-04-04
Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié)
這篇文章主要介紹了Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
java8 filter方法、Predicate接口的使用方式
這篇文章主要介紹了java8 filter方法、Predicate接口的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Jmeter多臺機器并發(fā)請求實現(xiàn)壓力性能測試
這篇文章主要介紹了Jmeter多臺機器并發(fā)請求實現(xiàn)壓力性能測試,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10
Java?注解@PostConstruct的原理及最佳使用場景分析
@PostConstruct?是?Java?中非常實用的注解,尤其是在?Spring?等框架中,它使得開發(fā)者可以方便地在?Bean?初始化后執(zhí)行額外的操作,本文給大家介紹@PostConstruct?的原理、使用場景及最佳實踐,感興趣的朋友一起看看吧2025-04-04

