Java中的八種基本數(shù)據(jù)類型詳解
一、八種基本數(shù)據(jù)類型常識(shí)
基本常識(shí)表

對(duì)于上圖有以下幾點(diǎn)需要注意:
- java八種基本數(shù)據(jù)類型分為四類八種,四類分別為整型、浮點(diǎn)型、布爾型、字符型;八種分別為byte、short、int、long、float、double、boolean、char;
- java八種基本數(shù)據(jù)類型的字節(jié)數(shù):分別為1、2、4、8個(gè)字節(jié);1字節(jié)(byte、boolean)、 2字節(jié)(short、char)、4字節(jié)(int、float)、8字節(jié)(long、double);
- 整數(shù)的默認(rèn)類型為int,浮點(diǎn)數(shù)的默認(rèn)類型為double;
- 八種基本數(shù)據(jù)類型的包裝類:除了char的是Character、int類型的是Integer,其他都是首字母大寫(xiě)
- 關(guān)于值的范圍問(wèn)題,需要注意char類型是無(wú)符號(hào)的,不能為負(fù),所以是0開(kāi)始的;
詳解二、直接量與類型轉(zhuǎn)換
2.1、直接量
- 整數(shù)型的直接量默認(rèn)為int類型
- 浮點(diǎn)型的直接量默認(rèn)為double類型
@Test
public void d() {
int a=100;//這個(gè)100就是直接量
a=a+100;//但是這個(gè)a+100不是直接量
double b=3.14;
}2.2、類型轉(zhuǎn)換
1.自動(dòng)轉(zhuǎn)換:低類型的向高類型的轉(zhuǎn)換
如下圖:順著箭頭的方向是可以自動(dòng)轉(zhuǎn)換的;

2.強(qiáng)制轉(zhuǎn)換:高類型的向底類型轉(zhuǎn)換,但可能會(huì)數(shù)據(jù)溢出或者精度丟失
以上現(xiàn)象在實(shí)際中可以出現(xiàn)這三種問(wèn)題:
- 定義變量時(shí)出現(xiàn)的類型轉(zhuǎn)換
@Test
public void e(){
long a=200;//200是直接量,默認(rèn)為int類型這里是自動(dòng)轉(zhuǎn)換為弄類型
/*long b=100000000000;*/
//100000000000是個(gè)整數(shù)直接量,默認(rèn)應(yīng)該為int類型,但是超出了int類型的取值范圍
long c=1000000000000L;
//在整數(shù)直接量后面將了一個(gè)L,表示該直接量不再默認(rèn)為int類型,為long類型,所以沒(méi)錯(cuò)
/*float d=34.3;*/
//浮點(diǎn)型直接量默認(rèn)為double,double類型大,所以不能直接轉(zhuǎn)換為float
float e=34.3f;
//在浮點(diǎn)數(shù)直接量后面加上一個(gè)f,表示該直接量不再默認(rèn)為double,為float類型
}以上為幾種正常的情況,但是有一種特殊的情況,就是int型直接量可以直接賦給byte、short、char類型變量,只要不超出變量類型的取值范圍
@Test
public void f() {
byte a=100;
short b=200;
char c=100;//注意char類型是一種特殊的int類型,可以不用寫(xiě)成單引號(hào)括起來(lái)的
/*byte d=128;直接量128超出了byte類型的取值范圍*/
/*char e=-1;直接量-1不在char類型的取值范圍內(nèi)*/
}- 數(shù)據(jù)運(yùn)算時(shí)的類型轉(zhuǎn)換
(1)運(yùn)算時(shí),運(yùn)算結(jié)果會(huì)向較大的類型轉(zhuǎn)換
@Test
public void g() {
int a=3;
double b=4;
System.out.println(a+b);//輸出7.0
float c=3.2f;
/*c=c+3.14; 編譯錯(cuò)誤,運(yùn)算之后變?yōu)閐ouble類型*/
}(2)特殊的:byte、short、char三種數(shù)據(jù)類型參與運(yùn)算時(shí),先一律轉(zhuǎn)化為int類型;
@Test
public void h() {
byte a=3;
byte b=4;
/*byte c=a+b;
* 編譯錯(cuò)誤,此處由于byte類型參與運(yùn)算時(shí),先直接轉(zhuǎn)換為int類型,
* 所以最后的結(jié)果也是int類型,但是得出的結(jié)果不能叫做int類型的直接量,所以編譯錯(cuò)誤
* */
int d=a+b;
}- 強(qiáng)制轉(zhuǎn)換
高等級(jí)轉(zhuǎn)為低等級(jí)的時(shí)候,必須強(qiáng)制轉(zhuǎn)換,但實(shí)際工作中不推薦使用強(qiáng)制轉(zhuǎn)換,可能會(huì)失精度或數(shù)據(jù)溢出;
@Test
public void j() {
int a=128;
byte b=(byte)a;
System.out.println(b);//輸出-128,出現(xiàn)了數(shù)據(jù)溢出
double c=1.23;
int d=(int)c;
System.out.println(d);//輸出1,精度丟失
}補(bǔ)充說(shuō)明:不是只有強(qiáng)制轉(zhuǎn)換的時(shí)候會(huì)出現(xiàn)數(shù)據(jù),例如下面這種情況
@Test
public void k() {
int a=10000000;
int b=10000000;
int c=a*b;
System.out.println(c);//輸出276447232,得到的結(jié)果超出了int類型的范圍,數(shù)據(jù)溢出
}三、對(duì)應(yīng)包裝類及使用
3.1、基本介紹
java是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,但是8中基本數(shù)據(jù)類型不具備面向?qū)ο蟮奶卣?,所以?shí)際使用中很不便所以為java八種基本數(shù)據(jù)類型提供了對(duì)應(yīng)的包裝類。
| 基本數(shù)據(jù)類型 | 對(duì)應(yīng)包裝類 | 包裝類的父類 |
| byte | java.lang.Byte | java.lang.Number |
| short | java.lang.Short | java.lang.Number |
| int | java.lang.Integer | java.lang.Number |
| long | java.lang.Long | java.lang.Number |
| float | java.lang.Float | java.lang.Number |
| double | java.lang.Double | java.lang.Number |
| boolean | java.lang.Boolean | java.lang.Object |
| char | java.lang.Character | java.lang.Object |
- 對(duì)應(yīng)包裝類比較特殊的就是int對(duì)應(yīng)的Integer和char對(duì)應(yīng)的Character;
- 對(duì)應(yīng)包裝類的直接父類:前6個(gè)由于是數(shù),直接父類為Number,而后兩個(gè)的直接父類就是Object類;
3.2、常用方法一:靜態(tài)方法 valueOf()
- 參數(shù)為基本數(shù)據(jù)類型,返回包裝類對(duì)象;
- 參數(shù)為String字符串(Character類沒(méi)有以String為 參數(shù)的該方法),返回包裝類對(duì)象;
@Test
public void a() {
/*1.參數(shù)為基本數(shù)據(jù)類型
* 作用:將基本數(shù)據(jù)類型轉(zhuǎn)換為對(duì)應(yīng)包裝類 * */
Integer i=Integer.valueOf(10);
System.out.println(i);//輸出10
/*2.參數(shù)為String字符串時(shí),
* 作用:返回指定字符串值的包裝類對(duì)象
* */
Integer a=Integer.valueOf("100");
System.out.println(a);//輸出100
Integer b=Integer.valueOf("100a")為
System.out.println(b);//運(yùn)行錯(cuò)誤,字符串的值不少一個(gè)int類型的
}3.3、常用方法二:靜態(tài)方法parseXXX(String str)
- Character類沒(méi)有該方法;
- 作用:將字符串裝換為對(duì)應(yīng)的基本數(shù)據(jù)類型(注意此處和上面的valueOf方法返回值的不同);
@Test
public void b() {
/*作用:將給定字符串裝換為對(duì)應(yīng)的基本數(shù)據(jù)類型
* 前提是該字符串必須正確描述該基本數(shù)據(jù)類型表示的值*/
int a=Integer.parseInt("100");
System.out.println(a);//輸出100
int b=Integer.parseInt("100a");
System.out.println(b);//運(yùn)行錯(cuò)誤,字符串的值不為int類型
}3.4、常用方法二:非靜態(tài)方法XXXValue()
- 因?yàn)槭欠庆o態(tài)方法,所以不能像上面兩個(gè)方法用類名調(diào)用了;
- 數(shù)字類的包裝類(八種包裝類中父類是Number的的六個(gè)類)才有該方法;
- 作用:將當(dāng)前包裝類對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的基本數(shù)據(jù)類型;
@Test
public void c() {
/*作用:將包裝類對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的基本數(shù)據(jù)類型*/
Integer a=Integer.valueOf(100);//將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝類對(duì)象
int b=a.intValue();//將包裝類對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的基本數(shù)據(jù)類型
System.out.println(b);//輸出100
Double c=Double.valueOf(2.33);
double d=c.doubleValue();
System.out.println(d);
}3.5、自動(dòng)拆箱與裝箱
簡(jiǎn)介:jdk1.5之后的新特性。該特性是編譯器認(rèn)可的,是在編譯器自動(dòng)將基本數(shù)據(jù)類型和包裝類相互轉(zhuǎn)換,節(jié)省了麻煩。
- 自動(dòng)拆箱 包裝類——>基本數(shù)據(jù)類型 (原理是調(diào)用了xxxValue方法)
- 自動(dòng)裝箱 基本數(shù)據(jù)類型——>包裝類 (原理是調(diào)用了valueOf方法)
@Test
public void d() {
/*自動(dòng)裝箱:valueOf*/
Integer i=123;//原理是 Integer i=Integer.valueOf(123);
/*自動(dòng)拆箱*/
int i1=i+1;//原理是 int i1=i.intValue()+1;
Integer a=123;
Integer b=123;
Integer c=a+b;
/*原理為Integer c=Integer.valueOf(a.intValue()+b.intValue());*/
}3.6、關(guān)于valueOf()方法源碼研究
通過(guò)按住Ctrl鍵,鼠標(biāo)點(diǎn)擊該方法即可查看源碼,以Integer類的valueOf(int i)的源碼為例
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}- 關(guān)于源碼的理解:Integer類的valueOf(int i)方法首先會(huì)判斷i是否在-128~127之間,如果在的話,就返回的對(duì)象是Integer類中靜態(tài)數(shù)組cache中的對(duì)象,如果不是在這之間,就會(huì)重寫(xiě)創(chuàng)建一個(gè)新的對(duì)象。
通過(guò)查看其它類的該方法的源碼之后,可以得到該表:
| 包裝類 | valueOf(X i)返回對(duì)象的原則 |
| Byte | 直接取,數(shù)組范圍為(-128,127),且byte值的范圍也是(-128,127) |
| Short | (-128,127)之間在數(shù)組中取,否則new |
| Integer | (-128,127)之間在數(shù)組中取,否則new |
| Long | (-128,127)之間在數(shù)組中取,否則new |
| Float | 直接new |
| Double | 直接new |
| Boolean | 直接返回,不new |
| Character | 0-127之間從數(shù)組中取,否則new |
四、相關(guān)面試題
4.1、類型轉(zhuǎn)換
注意一些喜歡忽視的類型轉(zhuǎn)換
public static void main(String[] args) {
int a=10;
double b=3.4;
System.out.println(a>b?a:b);
System.out.println(a);
}
/*輸出:10.0 10
解析:這里是一個(gè)很容易讓人不注意的類型轉(zhuǎn)化,這里a與b參與了運(yùn)算,
所以類型向類型大的方向轉(zhuǎn)化,10就變成了10.0,但是a本身是沒(méi)有變化的*/4.2、+=的情況
public static void main(String[] args) {
short a=1; //第一行
a=a+1; //第二行
a+=1; //第三行
}
/*第幾行的代碼會(huì)出錯(cuò)?
答案:第二行會(huì)出錯(cuò),由于a+1變?yōu)榱薸nt類型,而int類型不能直接賦值給short類型
但是+=這種情況是特殊的,所以不會(huì)出錯(cuò);
*/4.3、自動(dòng)裝箱
包裝類和基本數(shù)據(jù)類型比較時(shí),只要值相等就相等
public static void main(String[] args) {
Integer a1=127;
Integer a2=127;
int a3=127;
Integer b1=128;
Integer b2=128;
int b3=128;
System.out.println(a1==a2);
System.out.println(a1==a3);
System.out.println(b1==b2);
System.out.println(b1==b3);
}
/*輸出:true true false true
解析:自動(dòng)裝箱時(shí)采用valueOf方法,由于127在靜態(tài)數(shù)組的范圍內(nèi),所以不是new的,
而128的兩個(gè)引用是指向new出現(xiàn)對(duì)象的,所以第一個(gè)是true,第三個(gè)是false。
而包裝類和基本數(shù)據(jù)類型比較時(shí),只要數(shù)值是相等的,就相等
*/4.4、char類型存儲(chǔ)漢字
char類型能不能存儲(chǔ)一個(gè)漢字?為什么?
解析:能,char類型采用的是Unicode編碼,Unicode編碼包含漢字,所以char類型自然是可以存儲(chǔ)一個(gè)漢字的
4.5、浮點(diǎn)數(shù)精度問(wèn)題
public static void main(String[] args) {
System.out.println(0.1*3==0.3);
System.out.println(0.1*4);
}
/*輸出:false 0.4
解析:有些浮點(diǎn)數(shù)不能準(zhǔn)確的表示出來(lái),與整數(shù)相乘之后出精度丟失,常見(jiàn)為小數(shù)位含3的
*/到此這篇關(guān)于Java八種基本數(shù)據(jù)類型的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot項(xiàng)目不占用端口啟動(dòng)的方法
這篇文章主要介紹了SpringBoot項(xiàng)目不占用端口啟動(dòng)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Spring Boot基礎(chǔ)學(xué)習(xí)之Mybatis操作中使用Redis做緩存詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot基礎(chǔ)學(xué)習(xí)之Mybatis操作中使用Redis做緩存的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-11-11
java swing編程入門(mén)代碼編寫(xiě)(java編程入門(mén))
Swing是一個(gè)為Java設(shè)計(jì)的GUI工具包,是用來(lái)做UI界面的,大家看了下面的介紹就要吧自己做java界面了2013-12-12
Java8新特性之泛型的目標(biāo)類型推斷_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說(shuō)所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。下面通過(guò)本文給分享Java8新特性之泛型的目標(biāo)類型推斷,感興趣的朋友參考下吧2017-06-06
spring @Profiles和@PropertySource實(shí)現(xiàn)根據(jù)環(huán)境切換配置文件
這篇文章主要介紹了spring @Profiles和@PropertySource根據(jù)環(huán)境切換配置文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

