天天看點

Java基礎-基礎文法-基本資料類型

Java工程師知識樹 / Java基礎

文章目錄

        • 概述:
        • 分類:
        • 8 種類型表示範圍如下:
        • 封裝類的緩存範圍測試
        • Java中的char類型
        • Java自動類型轉換
        • 自動裝箱與自動拆箱
          • 什麼是拆箱什麼是裝箱
          • 拆箱與裝箱是如何實作的
          • 綜合範例

概述:

變量就是申請記憶體來存儲值。也就是說,當建立變量的時候,需要在記憶體中申請空間。

記憶體管理系統根據變量的類型為變量配置設定存儲空間,配置設定的空間隻能用來儲存該類型資料。

是以,通過定義不同類型的變量,可以在記憶體中儲存整數、小數或者字元。

分類:

Java語言提供了八種基本類型。六種數字類型(四個整數型,兩個浮點型),一種字元類型,還有一種布爾型。

基本資料類型 byte short int long char float double boolean
類型 整數類型 整數類型 整數類型 整數類型 文本類型 浮點類型 浮點類型 布爾型
封裝類 Byte Short Integer Long Character Float Double Boolean
緩存類 ByteCache ShortCache IntegerCache LongCache CharacterCache
緩存值 (-128到127) (-128到127) (-128到127) (-128到127) (0到127)

8 種類型表示範圍如下:

byte:8位,最大存儲資料量是256,存放的資料範圍是-128~127之間。

short:16位,最大資料存儲量是65536,資料範圍是-32768~32767之間。

int:32位,最大資料存儲容量是2的32次方減1,資料範圍是負的2的31次方到正的2的31次方減1。

long:64位,最大資料存儲容量是2的64次方減1,資料範圍為負的2的63次方到正的2的63次方減1。

float:32位,資料範圍在3.4e-45~1.4e38,指派時可以加上f或F也可以不加。

double:64位,資料範圍在4.9e-324~1.8e308,指派時可以加d或D也可以不加。

boolean:隻有true和false兩個取值。

char:16位,存儲Unicode碼,用單引号指派

封裝類的緩存範圍測試

public class TestMain {
    public static void main(String[] args) {
        testShort();
        testInteger();
        testFloat();
        testCharacter();
    }

    public static void testShort(){
        Short i1 = 127;
        Short i2 = 127;
        System.err.println(i1 == i2);
        i1 = 128;
        i2 = 128;
        System.err.println(i1 == i2);
    }

    public static void testInteger(){
        Integer i1 = 127;
        Integer i2 = 127;
        System.err.println(i1 == i2);
        i1 = 128;
        i2 = 128;
        System.err.println(i1 == i2);
    }

    public static void testFloat(){
        Float i1 = 127F;
        Float i2 = 127F;
        System.err.println(i1 == i2);
        i1 = 128F;
        i2 = 128F;
        System.err.println(i1 == i2);
    }
    public static void testCharacter(){
        Character i1 = 127;
        Character i2 = 127;
        System.err.println(i1 == i2);
        i1 = 128;
        i2 = 128;
        System.err.println(i1 == i2);
    }
}
結果:
true
false

true
false

false
false

true
false
           

Java中的char類型

1、JAVA中,char占2位元組,16位。可在存放漢字

2、char指派

char a=‘a’; //任意單個字元,加單引号。

char a=‘中’;//任意單個中文字,加單引号。

char a=111;//整數。0~65535。十進制、八進制、十六進制均可。輸出字元編碼表中對應的字元。

注:隻能放單個字元。

3、char運算

char類型是可以運算的因為char在ASCII等字元編碼表中有對應的數值。

在JAVA中,對char類型字元運作時,直接當做ASCII表對應的整數來對待。

示例:

char m=‘a’;  ——a。

char m=‘a’+‘b’;  ——Ã。 //char類型相加,提升為int類型,輸出對應的字元。注,在CMD.exe用輸出結果是問題?,不同的編碼輸出顯示不一樣。Eclipse中須改成UTF-8。

int m=‘a’+‘b’;   ——195。//195沒有超出int範圍,直接輸出195。

char m=‘a’+b;  ——報錯。//因為b是一個指派的變量。

char m=197;  ——Ã。 //輸出字元編碼表中對應的字元。

char m='197;  ——報錯。//因為有單引号,表示是字元,隻允許放單個字元。

char m=‘a’+1;  ——b。//提升為int,計算結果98對應的字元是b。

char m=‘中’+‘國’;  ——42282。

char m=‘中’+‘國’+‘國’+‘國’;  ——報錯。int轉char有損失。因為結果已經超出char類型的範圍。

int m=‘中’+‘國’+‘國’+‘國’;  ——86820

char m=‘中’+1;  ——丮。//1是int,結果提升為int,輸出對應的字元。

char m=‘中’+“國”;  ——報錯。String無法轉換為char。

System.out.println(‘中’+“國”);  ——中國。//沒有變量附值的過程。String與任何字元用“+”相連,轉換為String。

總結:

用單引号’'辨別,隻能放單個字元。

char+char,char+int——類型均提升為int,附值char變量後,輸出字元編碼表中對應的字元。

Java自動類型轉換

1)兩種類型是彼此相容的

2)轉換的目的類型占得空間範圍一定要大于轉化的源類型

**正向過程:**由低位元組向高位元組自動轉換

byte-short-char>int->long->float->double

Java基礎-基礎文法-基本資料類型

**逆向過程:**使用強制轉換,可能丢失精度。

int a=(int)3.14;

格式:目标類型 變量=(目标類型)源類型變量/常量

Java定義了若幹使用于表達式的類型提升規則:

1)所有的byte型. short型和char型将被提升到int型(例外: final修飾的short, char變量相加後不會被自動提升。)

2)如果一個操作數是long形 計算結果就是long型;

3)如果一個操作數是float型,沒有double類型,計算結果就是float型;

4)如果一個操作數是double型,計算結果就是double型;

易錯點:

byte b1=1,b2=2,b3,b6; 
final byte b4=4,b5=6; 
b6=b4+b5; 
b3=(b1+b2);   //會發生編譯錯誤
System.out.println(b3+b6);
//沒有final修飾的變量相加後會被自動提升為int型,與目标類型byte不相容,需要強制轉換(向下轉型)。
byte b;
b=3;
b=(byte)b*3    //編譯出錯,因為(byte)的運算級别比*高,是以會先轉換b後再*3
b=(byte)(b*3)  //正确
           

自動裝箱與自動拆箱

什麼是拆箱什麼是裝箱

裝箱就是 自動将基本資料類型轉換為包裝器類型;

拆箱就是 自動将包裝器類型轉換為基本資料類型。

拆箱與裝箱是如何實作的

裝箱和拆箱的實作過程:裝箱過程是通過調用包裝器的valueOf方法實作的,而拆箱過程是通過調用包裝器的 xxxValue方法實作的。(xxx代表對應的基本資料類型)。

注意,Integer、Short、Byte、Character、Long這幾個類的valueOf方法的實作是類似的。

Double、Float的valueOf方法的實作是類似的。

綜合範例
public class Main {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        Long h = 2L;
        System.out.println(c == d);
        System.out.println(e == f);
        System.out.println(c == (a + b));
        System.out.println(c.equals(a + b));
        System.out.println(g == (a + b));
        System.out.println(g.equals(a + b));
        System.out.println(g.equals(a + h));
    }
}
結果:
true
false
true
true
true
false
true
           

歡迎關注簡書

https://www.jianshu.com/u/2d59a41f50a9