先說理論,八種基本數據類型:byte、short、int、long、float、double、boolean、char。
概念
byte
- 8位、有符號的以二進制補碼表示的整數
- min : -128(-2^7)
- max: 127(2^7-1)
- default: 0
- 對應包裝類:Byte
short
- 16位、有符號的以二進制補碼表示的整數
- min : -32768(-2^15)
- max: 32767(2^15 - 1)
- default: 0
- 對應包裝類:Short
int
- 32位、有符號的以二進制補碼表示的整數
- min : -2,147,483,648(-2^31)
- max: 2,147,483,647(2^31 - 1)
- default: 0
- 對應包裝類:Integer
long
- 64位、有符號的以二進制補碼表示的整數
- min : -9,223,372,036,854,775,808(-2^63)
- max: 9,223,372,036,854,775,807(2^63 -1)
- default: 0
- 對應的包裝類:Long
float
- 單精度、32位、符合IEEE 754標准的浮點數
- float 在儲存大型浮點數組的時候可節省內存空間
- 浮點數不能用來表示精確的值,如貨幣
- default: 0.0f
- 對應的包裝類:Float
double
- 雙精度、64位、符合IEEE 754標准的浮點數
- 浮點數的默認類型為double類型
- double類型同樣不能表示精確的值,如貨幣
- default: 0.0d
- 對應的包裝類:Double
char
- char類型是一個單一的 16 位 Unicode 字符
- 最小值是 \u0000(即為0)
- 最大值是 \uffff(即為65,535)
- char 數據類型可以儲存任何字符
- 對應的包裝類:Character
boolean
- boolean數據類型表示一位的信息
- 只有兩個取值:true 和 false
- 這種類型只作為一種標志來記錄 true/false 情況
- 對應的包裝類:Boolean
實例
對於數值類型的基本類型的取值范圍,我們無需強制去記憶,因為它們的值都已經以常量的形式定義在對應的包裝類中了。請看下面的例子:
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub // byte System.out.println("基本類型:byte 二進制位數:" + Byte.SIZE); System.out.println("包裝類:java.lang.Byte"); System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE); System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE); System.out.println(); // short System.out.println("基本類型:short 二進制位數:" + Short.SIZE); System.out.println("包裝類:java.lang.Short"); System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE); System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE); System.out.println(); // int System.out.println("基本類型:int 二進制位數:" + Integer.SIZE); System.out.println("包裝類:java.lang.Integer"); System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE); System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE); System.out.println(); // long System.out.println("基本類型:long 二進制位數:" + 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(); // float System.out.println("基本類型:float 二進制位數:" + Float.SIZE); System.out.println("包裝類:java.lang.Float"); System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE); System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE); System.out.println(); // double System.out.println("基本類型:double 二進制位數:" + 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(); // char System.out.println("基本類型:char 二進制位數:" + Character.SIZE); System.out.println("包裝類:java.lang.Character"); // 以數值形式而不是字符形式將Character.MIN_VALUE輸出到控制台 System.out.println("最小值:Character.MIN_VALUE="+ (int) Character.MIN_VALUE); // 以數值形式而不是字符形式將Character.MAX_VALUE輸出到控制台 System.out.println("最大值:Character.MAX_VALUE="+ (int) Character.MAX_VALUE); } }
結果:
基本類型:byte 二進制位數:8 包裝類:java.lang.Byte 最小值:Byte.MIN_VALUE=-128 最大值:Byte.MAX_VALUE=127 基本類型:short 二進制位數:16 包裝類:java.lang.Short 最小值:Short.MIN_VALUE=-32768 最大值:Short.MAX_VALUE=32767 基本類型:int 二進制位數:32 包裝類:java.lang.Integer 最小值:Integer.MIN_VALUE=-2147483648 最大值:Integer.MAX_VALUE=2147483647 基本類型:long 二進制位數:64 包裝類:java.lang.Long 最小值:Long.MIN_VALUE=-9223372036854775808 最大值:Long.MAX_VALUE=9223372036854775807 基本類型:float 二進制位數:32 包裝類:java.lang.Float 最小值:Float.MIN_VALUE=1.4E-45 最大值:Float.MAX_VALUE=3.4028235E38 基本類型:double 二進制位數:64 包裝類:java.lang.Double 最小值:Double.MIN_VALUE=4.9E-324 最大值:Double.MAX_VALUE=1.7976931348623157E308 基本類型:char 二進制位數:16 包裝類:java.lang.Character 最小值:Character.MIN_VALUE=0 最大值:Character.MAX_VALUE=65535
Float和Double的最小值和最大值都是以科學記數法的形式輸出的,結尾的“E+數字”表示E之前的數字要乘以10的多少倍。比如3.14E3就是3.14×1000=3140,
3.14E-3就是3.14/1000=0.00314。
關系
1、自動類型轉換
自動類型轉換,也稱隱式類型轉換,是指不需要書寫代碼,由系統自動完成的類型轉換。由於實際開發中這樣的類型轉換很多,所以 Java 語言在設計時,沒有為該操作設計語法,而是由 JVM自動完成。
轉換規則:從存儲范圍小的類型到存儲范圍大的類型。
具體規則為:byte→short(char)→int→long→float→double
也就是說 byte 類型的變量可以自動轉換為 short 類型,示例代碼:
byte b=10;
short sh=b;
這里在給sh賦值時,JVM首先將b的值轉換成short類型然后再賦值給sh。
當然,在類型轉換的時候也可以跳躍,就是byte也可以自動轉換為int類型的。
注意問題:在整數之間進行類型轉換的時候數值不會發生變化,但是當將整數類型特別是比較大的整數類型轉換成小數類型的時候,由於存儲精度的不同,可能會存在數據精度的損失。
2、強制類型轉換
強制類型轉換,也稱顯式類型轉換,是指必須書寫代碼才能完成的類型轉換。該類類型轉換很可能存在精度的損失,所以必須書寫相應的代碼,並且能夠忍受該種損失時才進行該類型的轉換。
轉換規則:從存儲范圍大的類型到存儲范圍小的類型。
具體規則為:double→float→long→int→short(char)→byte
語法格式為:(轉換到的類型)需要轉換的值
double d=3.14;
int i=(int) d;
注意問題:強制類型轉換通常都會存儲精度的損失,所以使用時需要謹慎。
3.運算
同類型之間運算,只需注意考慮臨界值的問題。
非同類型之間,會用到上面的1、2 轉換相同類型進行運算。
經典面試題
1、short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 +=1;有什么錯?
答:對於short s1=1;s1=s1+1來說,在s1+1運算時會自動提升表達式的類型為int,那么將int賦予給short類型的變量s1會出現類型轉換錯誤。
對於short s1=1;s1+=1來說 +=是java語言規定的運算符,java編譯器會對它進行特殊處理,因此可以正確編譯。
2、char類型變量能不能儲存一個中文的漢子,為什么?
char類型變量是用來儲存Unicode編碼的字符的,unicode字符集包含了漢字,所以char類型當然可以存儲漢字的,還有一種特殊情況就是某個生僻字沒有包含在unicode編碼字符集中,那么就char類型就不能存儲該生僻字。
3、Integer和int的區別
int是java的8種內置的原始數據類型。Java為每個原始類型都提供了一個封裝類,Integer就是int的封裝類。
int變量的默認值為0,Integer變量的默認值為null,這一點說明Integer可以區分出未賦值和值為0的區別,比如說一名學生沒來參加考試,另一名學生參加考試全答錯了,那么第一名考生的成績應該是null,第二名考生的成績應該是0分。關於這一點Integer應用很大的。Integer類內提供了一些關於整數操作的一些方法,例如上文用到的表示整數的最大值和最小值。
4、switch語句能否作用在byte上,能否作用在long上,能否作用在string上?
byte的存儲范圍小於int,可以向int類型進行隱式轉換,所以switch可以作用在byte上
long的存儲范圍大於int,不能向int進行隱式轉換,只能強制轉換,所以switch不可以作用在long上
string在1.7版本之前不可以,1.7版本之后switch就可以作用在string上了
5.是否存在 x>x+1?為什么?
這就是臨界值,當x=最大值 時; 再加1(根據二進制運算+1)就超過了它的臨界值,剛好會是它最小值。
舉個例子吧,byte 8位, -128 ~ 127
127 二進制: 0111 1111
1 二進制 : 0000 0001
相加結果: 1000 0000
byte 8位 有符號, 1000 0000 剛好 為 -128
public class Test { public static void main(String[] args) { // int System.out.println("基本類型:int 二進制位數:" + Integer.SIZE); System.out.println("包裝類:java.lang.Integer"); System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE); System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE); System.out.println(Integer.MAX_VALUE+1); } }
結果:
基本類型:int 二進制位數:32 包裝類:java.lang.Integer 最小值:Integer.MIN_VALUE=-2147483648 最大值:Integer.MAX_VALUE=2147483647 -2147483648