Java8大基本數據類型
byte(字節型)、short(短整型)、int (整型) 、long(長整型)、float(單精度浮點型)、double(雙精度浮點型)、boolean(布爾型)、char(字符型)
數值型
整型
- Byte數據類型是8位
取值范圍:(-128 - 127)
默認值:0
byte a= 100; byte b = -20; - short數據類型是16位
取值范圍:(-2^15 - 2^15 -1)
默認值:0 - int 數據類型是32位
取值范圍:(-2^31 - 2^31 -1)
默認值:0 - long數據類型是64位
默認值:0L
long a = 10000L;
整型常量若要聲明為long類型,需要在數字后加上l或L, -
在Java中任何一個整型常量均為int類型
浮點型
- float數據類型是單精度、32位、符合IEEE754標准的浮點數;
默認值:0.0f
float fl = 2.3f;
若要定義float類型的變量需要在小數后面追加f或者F - double數據類型是雙精度、64位、符合IEEE 754標准的浮點數;
默認值:0.0d
double d = 2.3; - 小數常量默認也是double類型,
描述整數用int,描述小數用double。
long一般用於描述日期、時間、內存、文件大小
IO處理一般使用byte
字符型
- char
- 一般用於描述中文(基本忽略)
取值范圍:(\u0000 - \uffff) —>(0 - 65535);
字符型用’ '表示;char ch = ‘A’;
char和int可以相互轉換,char轉int直接賦值,int 轉char強轉。
布爾型
- boolean
- 表示一位的信息
只有兩個取值:true和false
默認值:false
boolean flag = true;
對於數據類型的基本類型的取值范圍,不需要強記,因為它們的值都已經以常量的形式定義在對應的包裝類中了。
public class PrimitiveTypeTest{ public static void main(String[] args){ //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的多少次方。
eg:1.4E-45 —> 1.4 ✖ 10^(-45)
數據轉換
Java中數據類型轉換必須滿足如下規則:
1.不能對boolean類型進行類型轉換
2.不能把對象類型轉換成不相關類的對象
3.小的數據類型與大的數據類型做數值運算時,小的數據類型會自動提升為大的數據類型。
4.大的數據類型要轉為小的數據類型必須強轉,強轉可能會丟失數據。
5.浮點數到整數的轉換是通過舍棄小數得到,而不是四舍五入
轉換從低級到高級
低 --------------------> 高
byte,short,char->int->long->float->double
舉例說明:
public class Test{ public static void main(String[] args){ int maxValue = Integer.MAX_VALUE; int minValue = Integer.MIN_VALUE; System.out.println("maxValue = " + maxValue ); System.out.println("minValue = " + minValue ); System.out.println("maxValue + 1 = " + (maxValue + 1)); System.out.println("minValue - 1 = " + (minValue - 1)); } }
運行結果:
maxValue = 2147483647 minValue = -2147483648 maxValue + 1 = -2147483648 minValue - 1 = 2147483647
int型存在數據溢出問題,解決方案只有一個:更換數據類型
使用long來解決數據溢出問題:
int maxValue = Integer.MAX_VALUE; int minValue = Integer.MIN_VALUE; long max = maxValue + 1L; long min = minValue - 1L;
運行結果:
maxValue = 2147483647 minValue = -2147483648 maxValue + 1 = 2147483648 minValue - 1 = -2147483649
因為程序執行順序是從右邊到左邊,所以這里在定義long類型變量時要給運算數字后面加L,不然運算結果還是int型發生溢出。
大的數據類型轉為小的數據類型,必須強轉,但有時會丟失內容
long num = 2147483648L; int result = (int) num; System.out.println(result);
運行結果:
-2147483648
關於數據默認值,默認值在主方法中無效
public class Test{ public static void main(String[] args){ int num ;//定義一個整型變量但並未初始化 System.out.println(num); } }
運行結果:
錯誤: 可能尚未初始化變量num
System.out.println(num);
^
1 個錯誤
這個時候有兩種解決方案,一種是在使用前進行賦值,另一種是在定義變量時賦值。
各個數據類型的默認值的使用,需要結合類才能觀察到
觀察變量默認值
class InitTest{ public int a; } public class Test{ public static void main(String[] args){ InitTest test = new InitTest(); System.out.println(test.a); } }
byte與int
整型常量若是在byte類型的保護范圍之內,可以直接賦值給byte變量,無須強轉;
若整型常量值超出byte范圍必須強轉,以及整型變量無論值是否在byte范圍中都需要強轉。
//10是int,int的范圍大於byte范圍,理論上要進行強轉,可是這里沒有強轉,因為數據在byte范圍內,強轉與不強轉結果一樣。 byte data = 10; System.out.println(data);
輸出結果:10
但是int變量賦值給byte類型,必須強轉
byte data = (byte)300;//300的二進制為1 0010 1100,經過強轉后的data只有8位,所以data = 0010 1100 = 44
char與int之間的轉換
char c= 'A';
int num = c + 32;//char可以直接轉為int System.out.println(num);
char x = (char) num;//int 要強轉到char
System.out.println(x);
輸出結果:97 和 a
補充:ASCII碼中65~90為26個大寫英文字母,97~122號為26個小寫英文字母
**注意:**字符型數字(‘0’ - ‘9’)與int數字(0 - 9) 不同
if('0' == 0)一定是false