1. 程式人生 > 實用技巧 >視覺化——圖表

視覺化——圖表

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編碼的字元單元,通常用來表示字元常量。字元型別可以當作數字來比較。
charjava中是2個位元組。 java採用unicode2個位元組(16位)來表示一個字元。

布林型別

1、簡介

布林型別有倆個值:falsetrue。注意:

void型別

void其實也算一種資料型別,它其實在虛擬機器中都有指定型別表示。

Class voidClass = void.class;

基本資料型別預設賦值

  • 如果是整數型別,預設為0
  • 如果是浮點型別,預設為0.0
  • 如果是字元型別,預設為\u0000
  • 如果是布林型別,預設為false
  • 如果是引用型別,預設為null

二、基本資料型別轉換

8種基本資料型別中除了boolean型別資料,其他資料型別可以相互轉換。
資料型別轉換分為倆種:

  • 自動型別轉換(隱式):低精度型別 轉 高精度型別;小範圍轉大範圍;
  • 強制型別轉換(顯示):高精度型別 轉 低精度型別;大範圍轉小範圍;

自動型別轉換

自動型別轉換髮生在低精度型別 轉 高精度型別,比如說:intdouble。在倆個不同基本型別的值操作的時候,有時就發生轉換:

  • 如果其中有一個運算元是 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;
  }

強制型別轉換

強制型別轉換髮生在將大的資料型別轉換為小的資料型別。比如說:doubleint。這時候,可能會發生資料溢位

三、基本包裝類

所有的包裝類都是不可變物件,都是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};
    }

可以理解成jdkJVM中為你建立int[]型別的位元組碼檔案,這個型別有length屬性。只不過它是由jdk為你建立的。

1、為什麼我從來沒有見過陣列的定義?
陣列是JVM提供的虛擬機器級別的支援,有對應的位元組碼,但無java原始碼;比如說在位元組碼層面上,陣列也是一個物件,也有length屬性。

2、為什麼說陣列是真泛型,而泛型是假泛型?

  • 真泛型是指在執行時,會有型別資訊;
  • 假泛型是指在執行時,沒有型別資訊;
String[] a = new String[10];
Object[] b = a;
b[0] = new Object();//這裡就會因為型別不同,而丟擲異常