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
**逆向過程:**使用強制轉換,可能丢失精度。
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