視覺化——圖表
java
資料型別包含:
- 基本資料型別:8種
- 引用資料型別:物件
- 陣列型別
一、基本資料型別
java
一共有四大種8小種資料型別:4種整型、2種浮點型、1種字串型別、1種布林型別。基本資料型別是在棧中分配的,而引用型別是在堆裡面分配空間的。
整數資料型別
1、簡介
沒有小數部分的數值,可以是負數。
int a = 10_0000_0000;//等價於1000000000
long b = 22_0000_0000;
2、分類
型別 | 位元組大小 | 取值範圍 |
---|---|---|
byte | 1位元組 | -128~127 |
short | 2位元組 | 正負3萬左右 |
int | 4位元組 | 正負20億左右 |
long | 8位元組 | 很大 |
- long 型別資料字尾 L 不要忘記
- byte 型別資料注意它的範圍
浮點資料型別
1、簡介
用於表示含小數的數值
2、分類
型別 | 位元組大小 | 取值範圍 |
---|---|---|
float | 4位元組 | 有效位數6位 |
double | 8位元組 | 有效位數15位 |
double
表示的數值精度是float
的倆倍,所以又被稱為雙精度數值。float
型別的數值後面要加一個字尾F。如3.14F
double
型別的數值可以不加字尾,也可以加字尾D
。如3.14D
3、近似表示
十進位制中,許多小數是無法用二進位制來表示的,只能用近似表示。比如計算機在計算:
0.1 + 0.2 = 0.30000000000000004; // 這就是因為近似表示的原因。
由於近似表示,我們需要注意浮點數可以比較大小,但不能使用 ==
Math
類來比較:
float a = 0.1f;
float b = 0.1f;
if (Math.abs(a - b) < 0.0000001){
System.out.println("a 與 b 相等");
}
4、BigDecimal
物件
由於浮點數型別不適合比較、不適合出現舍入誤差計算中。比如說:System.out.println(2.0-1.1)
結果是0.8999999999999999
,而不是0.9
。主要原因是浮點數值是採用二進位制系統表示,而在二進位制系統中無法精確表示分數1/10
1/3
。如果數值計算中需要不含任何的舍入誤差,應使用BigDecimal
類。
字元型別
1、簡介
表示Unicode
編碼的字元單元,通常用來表示字元常量。字元型別可以當作數字來比較。
char
在java
中是2
個位元組。 java
採用unicode
,2
個位元組(16位)來表示一個字元。
布林型別
1、簡介
布林型別有倆個值:false
、true
。注意:
- 整型值和布林值之間不能進行相互轉換
- 布林佔用位元組
void
型別
void
其實也算一種資料型別,它其實在虛擬機器中都有指定型別表示。
Class voidClass = void.class;
基本資料型別預設賦值
- 如果是整數型別,預設為
0
; - 如果是浮點型別,預設為
0.0
; - 如果是字元型別,預設為
\u0000
; - 如果是布林型別,預設為
false
; - 如果是引用型別,預設為
null
;
二、基本資料型別轉換
8
種基本資料型別中除了boolean
型別資料,其他資料型別可以相互轉換。
資料型別轉換分為倆種:
- 自動型別轉換(隱式):低精度型別 轉 高精度型別;小範圍轉大範圍;
- 強制型別轉換(顯示):高精度型別 轉 低精度型別;大範圍轉小範圍;
自動型別轉換
自動型別轉換髮生在低精度型別 轉 高精度型別,比如說:int
轉double
。在倆個不同基本型別的值操作的時候,有時就發生轉換:
- 如果其中有一個運算元是
double
,另一個運算元要先轉換為double
; - 否則,如果其中有一個運算元是
float
,另一個運算元要先轉換為float
; - 否則,如果其中有一個運算元是
long
,另一個運算元要先轉換為long
; - 否則,倆個運算元都會轉換為
int
型別;
常見的坑有:
public static void main(String[] args) throws IOException {
System.out.println("result = " + divide(3,2));//1.0
}
static double divide(int a,int b){
/*
\* 等價於:
\* double result = a / b;
\* return result;
*/
return a/b;
// return 1.0 * a / b;
}
強制型別轉換
強制型別轉換髮生在將大的資料型別轉換為小的資料型別。比如說:double
轉int
。這時候,可能會發生資料溢位。
三、基本包裝類
所有的包裝類都是不可變物件,都是final
的。
基本型別 | 對應的包裝類 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
int 轉 Integer優化
在int
基本資料型別資料會自動裝箱到Integer
,而每次裝箱都new
一個物件的話,可能有點浪費空間。
所以,JDK
預設基本資料為-128 ~ 127
之間的資料,裝箱到一個快取中,如果以後還有相同的數字想轉成Integer
的話,就預設從快取中獲取。
public static void main(String[] args) {
Integer a = 1;
Integer b = 1;
System.out.println(a);
}
四、陣列型別
陣列型別在jdk
是一種特殊的型別,你看不到它的定義,但仍然可以使用它。它是由jdk
根據特殊的指令來建立的。它主要特性有:
- 長度不可變
- 型別安全
- 只有一個
length
屬性 - 可以使用
for
迴圈迭代它
public static void main(String[] args) {
int[] a = new int[]{1,2,3};
}
可以理解成
jdk
在JVM
中為你建立int[]
型別的位元組碼檔案,這個型別有length屬性。只不過它是由jdk
為你建立的。
1、為什麼我從來沒有見過陣列的定義?
陣列是JVM
提供的虛擬機器級別的支援,有對應的位元組碼,但無java
原始碼;比如說在位元組碼層面上,陣列也是一個物件,也有length
屬性。
2、為什麼說陣列是真泛型,而泛型是假泛型?
- 真泛型是指在執行時,會有型別資訊;
- 假泛型是指在執行時,沒有型別資訊;
String[] a = new String[10];
Object[] b = a;
b[0] = new Object();//這裡就會因為型別不同,而丟擲異常