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ù)類型來實(shí)現(xiàn)的
- 基本數(shù)據(jù)類型只能存自己類型的值,無其他額外功能,具體介紹如下第2小節(jié)
- 引用類型:參數(shù)傳遞時(shí),以拷貝引用地址的方式傳遞給接收變量,而非復(fù)制整個(gè)數(shù)據(jù)本體。除八大基本數(shù)據(jù)類型之外的所有數(shù)據(jù)類型,都為引用數(shù)據(jù)類型。所有引用數(shù)據(jù)類型的默認(rèn)值都為null。
- 為了基本數(shù)據(jù)類型可以與引用數(shù)據(jù)類型互相轉(zhuǎn)換、以利用彼此的特性,java為每一種基本數(shù)據(jù)類型提供了相應(yīng)的包裝類。包裝類對(duì)基本數(shù)據(jù)類型進(jìn)行了封裝,提供了豐富的功能,包裝類是基本類型的拓展
- 包裝類是引用類型的一種,包裝類與基本數(shù)據(jù)類型一一對(duì)應(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種浮點(diǎn)型:float、double
1種字符類型:char
1種布爾型:boolean
2.2 基本數(shù)據(jù)類型詳解
基本類型 | 存儲(chǔ)大小 | 初始化默認(rèn)值 | 取值范圍 | 包裝類型 |
---|---|---|---|---|
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標(biāo)準(zhǔn)的浮點(diǎn)數(shù),1.4E-45 ~ 3.4028235E38 | Float |
double | 8字節(jié)(64位) | 0.0d | 符合IEEE754標(biāo)準(zhǔn)的浮點(diǎn)數(shù),4.9E-324 ~ 1.7976931348623157E308 | Double |
char | 2字節(jié)(16位) | ‘\u0000’ | \u0000 ~ \uffff(十進(jìn)制等效值為 0~65535,本質(zhì)也是數(shù)值) | Character |
boolean | 1字節(jié)(8位)/4字節(jié)(32位) | false | true/false | Boolean |
char 數(shù)據(jù)類型可以儲(chǔ)存任何字符。
float、double不能用來表示精確的值,運(yùn)算不精確——>解決方案:BigDecimal。創(chuàng)建BigDecimal對(duì)象的方式:
- BigDecimal(double val) : double類型的數(shù)據(jù)作為參數(shù),交給BigDecimal對(duì)象【不用,因?yàn)閐ouble本身不精確】
- BigDecimal(String val) : String類型的數(shù)據(jù)作為參數(shù),交給BigDecimal對(duì)象【用這個(gè)】
注:double->String 直接拼接一個(gè)字符串""就行。
對(duì)于數(shù)值類型的基本類型的取值范圍,我們無需強(qiáng)制去記憶,因?yàn)樗鼈兊闹刀家呀?jīng)以常量的形式定義在對(duì)應(yīng)的包裝類中
//long System.out.println("基本類型:long 二進(jìn)制位數(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 二進(jìn)制位數(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ū)別
- 存儲(chǔ)方式:基本數(shù)據(jù)類型直接存儲(chǔ)值,而引用數(shù)據(jù)類型存儲(chǔ)的是對(duì)象的引用(內(nèi)存地址)
- 內(nèi)存分配:基本數(shù)據(jù)類型在棧上分配內(nèi)存,引用數(shù)據(jù)類型在堆上分配內(nèi)存(具體內(nèi)容存放在堆中,棧中存放的是其具體內(nèi)容所在內(nèi)存的地址)。棧上的分配速度較快,但是內(nèi)存空間較小,而堆上的分配速度較慢,但可以分配更大的內(nèi)存空間
- 默認(rèn)值:基本數(shù)據(jù)類型會(huì)有默認(rèn)值,例如int類型的默認(rèn)值是0,boolean類型的默認(rèn)值是false。而引用數(shù)據(jù)類型的默認(rèn)值是null,表示沒有引用指向任何對(duì)象
- 復(fù)制操作:基本數(shù)據(jù)類型進(jìn)行復(fù)制時(shí),會(huì)復(fù)制該變量的值。而引用數(shù)據(jù)類型進(jìn)行復(fù)制時(shí),只會(huì)復(fù)制對(duì)象的引用,兩個(gè)變量指向同一個(gè)對(duì)象
- 參數(shù)傳遞:基本數(shù)據(jù)類型作為方法的參數(shù)傳遞時(shí),傳遞的是值的副本,不會(huì)修改原始值。而引用數(shù)據(jù)類型作為方法的參數(shù)傳遞時(shí),傳遞的是對(duì)象的引用,可以修改對(duì)象的屬性或狀態(tài)
- 比較操作:基本數(shù)據(jù)類型使用==進(jìn)行比較時(shí),比較的是值是否相等。而引用數(shù)據(jù)類型使用==進(jìn)行比較時(shí),比較的是引用是否指向同一個(gè)對(duì)象,如果要比較對(duì)象的內(nèi)容是否相同,需要使用equals()方法
注意:Java中的包裝類(Wrapper Classes)對(duì)基本數(shù)據(jù)類型進(jìn)行了封裝,使其也具有了對(duì)象的特性,可以調(diào)用方法和進(jìn)行類型轉(zhuǎn)換等操作。
2.4 基本數(shù)據(jù)類型與包裝類區(qū)別
- 存儲(chǔ)方式:基本類型直接存儲(chǔ)值,而包裝類型存儲(chǔ)的是對(duì)應(yīng)基本類型值的對(duì)象。
- 空值處理:基本類型沒有空值(null)的概念,而包裝類型可以將null作為有效值來表示缺失或無效值。
- 默認(rèn)值:基本類型有默認(rèn)值,例如int類型的默認(rèn)值是0,boolean類型的默認(rèn)值是false。而包裝類型的默認(rèn)值是null。
- 對(duì)象操作:基本類型不能直接調(diào)用方法,而包裝類型可以調(diào)用對(duì)應(yīng)的方法,例如Integer類的intValue()方法可以獲取保存在Integer對(duì)象中的值。
- 自動(dòng)裝箱/拆箱:基本類型和包裝類型之間可以進(jìn)行自動(dòng)裝箱和拆箱的轉(zhuǎn)換。自動(dòng)裝箱是指將基本類型的值自動(dòng)轉(zhuǎn)換為對(duì)應(yīng)的包裝類型對(duì)象,如int 轉(zhuǎn)Integer,Integer integer = 100,底層調(diào)用了Interger.valueOf(100)方法;而自動(dòng)拆箱則是將包裝類型對(duì)象自動(dòng)轉(zhuǎn)換為基本類型的值。
- 泛型支持:泛型只能使用引用類型,不能直接使用基本類型。因此,當(dāng)需要在泛型中使用基本類型時(shí),需要使用對(duì)應(yīng)的包裝類型。
- 比較方式:基本類型使用==進(jìn)行比較時(shí),比較的是值是否相等。而包裝類型使用==進(jìn)行比較時(shí),比較的是引用是否指向同一個(gè)對(duì)象,而不是比較值是否相等。若要比較包裝類型的值是否相等,需要使用equals()方法。
注意:在Java 5及其之后的版本中,基本類型和包裝類型之間的轉(zhuǎn)換會(huì)通過自動(dòng)裝箱、拆箱來自動(dòng)進(jìn)行,使得基本類型和包裝類型之間的使用更加方便
補(bǔ)充:
包裝類Integer的創(chuàng)建方式
1)Integer i1 = new Integer(3); 沒有高效的效果,new一次,創(chuàng)建一個(gè)包裝類對(duì)象
2)Integer i2 = Integer.valueOf(3); 有高效的效果,數(shù)據(jù)在-128~127的范圍內(nèi),才有高效的效果
3)Integer i3 = 3; 自動(dòng)裝箱:編譯器會(huì)把int類型5裝箱,變成Integer,底層調(diào)用Integer.valueOf(5)方法
包裝類Double的創(chuàng)建方式
1)Double d1 = new Double(2.7); 沒有高效的效果,new一次,創(chuàng)建一個(gè)包裝類對(duì)象
2)Double d2 = Double.valueOf(2.7);這個(gè)也沒有高效的效果,只有Integer有
自動(dòng)裝箱與自動(dòng)拆箱
Integer aInteger = 100; 自動(dòng)裝箱【編譯器會(huì)將int類型的100裝箱,變成Interger類型,底層調(diào)用 Interger.valueOf(100) 方法】
int a = aInteger; 自動(dòng)拆箱【編譯器會(huì)將包裝類型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)換主要分為兩種:自動(dòng)類型轉(zhuǎn)換(也稱為隱式轉(zhuǎn)換)、強(qiáng)制類型轉(zhuǎn)換(也稱為顯式轉(zhuǎn)換)。
轉(zhuǎn)換從低級(jí)到高級(jí):byte、short、char(三者同級(jí))——> int ——> long ——> float ——> double
- 自動(dòng)類型轉(zhuǎn)換:代碼無需任何處理,在代碼編譯時(shí) 編譯器會(huì)自動(dòng)進(jìn)行處理。特點(diǎn)——低級(jí)轉(zhuǎn)換高級(jí)。
- 強(qiáng)制類型轉(zhuǎn)換:需要在待轉(zhuǎn)換數(shù)據(jù)類型前 使用 (type)value, type是要強(qiáng)制類型轉(zhuǎn)換后的數(shù)據(jù)類型,可能會(huì)導(dǎo)致溢出或損失精度 。特點(diǎn)——高級(jí)轉(zhuǎn)換低級(jí)。
數(shù)據(jù)類型轉(zhuǎn)換必須滿足如下規(guī)則:
不能對(duì)boolean類型進(jìn)行類型轉(zhuǎn)換。
不能把對(duì)象類型轉(zhuǎn)換成不相關(guān)類的對(duì)象。
在把容量大的類型轉(zhuǎn)換為容量小的類型時(shí)必須使用強(qiáng)制類型轉(zhuǎn)換。
轉(zhuǎn)換過程中可能導(dǎo)致溢出或損失精度,例如:
int i =128; byte b = (byte)i;
因?yàn)?byte 類型是 8 位,最大值為127,所以當(dāng) int 強(qiáng)制轉(zhuǎn)換為 byte 類型時(shí),值 128 時(shí)候就會(huì)導(dǎo)致溢出。
浮點(diǎn)數(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)先級(jí)類型數(shù)據(jù) + 高優(yōu)先級(jí)類型數(shù)據(jù) ——> 結(jié)果會(huì)自動(dòng)轉(zhuǎn)換為高優(yōu)先級(jí)數(shù)據(jù) long sum = aInt + bLong; //long -> int 需要強(qiáng)制類型轉(zhuǎn)換 int d = (int) bLong; //double -> int 需要強(qiáng)制類型轉(zhuǎn)換 int e = (int) cDouble; System.out.println("自動(dòng)類型轉(zhuǎn)換 int—>long: " + sum); System.out.println("強(qiáng)制類型轉(zhuǎn)換 long—>int: " + d); System.out.println("強(qiáng)制類型轉(zhuǎn)換 double—>int: " + e); System.out.println(); //int 和 byte 轉(zhuǎn)換 byte fByte = (byte) aInt; //高轉(zhuǎn)低,強(qiáng)轉(zhuǎn) int gInt = fByte; //低轉(zhuǎn)高,自動(dòng) System.out.println("高轉(zhuǎn)低-強(qiáng)轉(zhuǎn),int->byte: " + fByte); System.out.println("低轉(zhuǎn)高-自動(dòng),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)高-自動(dòng),char->int: " + iInt); System.out.println("高轉(zhuǎn)低-強(qiáng)轉(zhuǎn),int->char: " + j); System.out.println(); //int 和 String 轉(zhuǎn)換 //int轉(zhuǎn)String: 1)使用String的ValueOf方法 2)直接使用 String類+ (即字符串拼接),任意字符串和其他類型"+" 都會(huì)把其他類型轉(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方法,當(dāng)字符串中包含非數(shù)字時(shí)會(huì)出錯(cuò) 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,強(qiáng)轉(zhuǎn): " + m); System.out.println("byte->char,強(qiáng)轉(zhuǎn): " + n); }
輸出:
自動(dòng)類型轉(zhuǎn)換 int—>long: 70
強(qiáng)制類型轉(zhuǎn)換 long—>int: 50
強(qiáng)制類型轉(zhuǎn)換 double—>int: 4高轉(zhuǎn)低-強(qiáng)轉(zhuǎn),int->byte: 20
低轉(zhuǎn)高-自動(dòng),byte->int: 20低轉(zhuǎn)高-自動(dòng),char->int: 97
高轉(zhuǎn)低-強(qiáng)轉(zhuǎn),int->char: aint轉(zhuǎn)String: 20, 20
String轉(zhuǎn)int: 18char->byte,強(qiáng)轉(zhuǎn): 97
byte->char,強(qiáng)轉(zhuǎn): a
總結(jié)
到此這篇關(guān)于Java數(shù)據(jù)類型(八種基本數(shù)據(jù)類型+四種引用類型)以及數(shù)據(jù)類型轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Java數(shù)據(jù)類型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項(xiàng)目集成日志的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot項(xiàng)目集成日志的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02Java操作XML轉(zhuǎn)JSON數(shù)據(jù)格式詳細(xì)代碼實(shí)例
在Java中我們可以使用一些現(xiàn)成的庫來實(shí)現(xiàn)XML到JSON的轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Java操作XML轉(zhuǎn)JSON數(shù)據(jù)格式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04Java HttpClient-Restful工具各種請(qǐng)求高度封裝提煉及總結(jié)
這篇文章主要介紹了Java HttpClient-Restful工具各種請(qǐng)求高度封裝提煉及總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Java將時(shí)間按月份分段的實(shí)現(xiàn)思路與方法
這篇文章主要給大家介紹了關(guān)于Java將時(shí)間按月份分段的實(shí)現(xiàn)思路與方法,通過文中介紹的方法可以將時(shí)間分成我們想要的時(shí)間段,文中給出了詳細(xì)的實(shí)例代碼,需要的朋友可以參考下2021-07-07java8 filter方法、Predicate接口的使用方式
這篇文章主要介紹了java8 filter方法、Predicate接口的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Java中while語句的簡(jiǎn)單知識(shí)及應(yīng)用
這篇文章主要給大家介紹了關(guān)于Java中while語句的簡(jiǎn)單知識(shí)及應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Jmeter多臺(tái)機(jī)器并發(fā)請(qǐng)求實(shí)現(xiàn)壓力性能測(cè)試
這篇文章主要介紹了Jmeter多臺(tái)機(jī)器并發(fā)請(qǐng)求實(shí)現(xiàn)壓力性能測(cè)試,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Java?注解@PostConstruct的原理及最佳使用場(chǎng)景分析
@PostConstruct?是?Java?中非常實(shí)用的注解,尤其是在?Spring?等框架中,它使得開發(fā)者可以方便地在?Bean?初始化后執(zhí)行額外的操作,本文給大家介紹@PostConstruct?的原理、使用場(chǎng)景及最佳實(shí)踐,感興趣的朋友一起看看吧2025-04-04