Java之基本數據類型


本文章分為四個部分:

1、基本數據類型的介紹

2、類型轉換

3、裝箱和拆箱

4、有道練習

5、增:編碼的那點事兒

--------------------------------------基本數據類型的介紹--------------------------------------

Java有8種基本數據類型,其中有4種整型、2種浮點類型、1種用於表示Unicode編碼的字符單元的字符類型char和1種用於表示真值的boolean類型。

類型

boolean

char

byte

short

int

long

float

double

存儲需求(字節)

1

2

1

2

4

8

4

8


1、boolean類型的取值范圍有兩個,true和false,用來判斷邏輯條件。

  並且整型值和布爾值之間不能進行相互轉換。

2、char類型原本用於表示單個字符,不過現在有些Unicole字符可以用一個char值描述,另外一些Unicole字符可以用兩個char值。

  char類型的字面量值要用單引號括起來。

  而且Unicode轉義序列會在解析代碼之前得到處理。

3、整型用於表示沒有小數部分的數值,它允許是負數。

Java提供了4種整型:byte、short、int、long。

Java中是沒有任何無符號(unsigned)形式的int、short、long或者byte類型的。

而且如果要表示長整形數據(long),后者要加上后綴L或者l。如果要表示二進制數,則加上前綴0B或者0b;如果要表示八進制數,則加上前綴0;如果要表示十六進制數,則加上前綴0X或者0x。

注意,byte的取值范圍是:-128~127。

4、浮點類型用於表示有小數部分的數值。

在Java中有兩種浮點類型 。

double表示這種類型的數據精度是float類型的兩倍(雙精度),絕大部分應用程序都采用double類型。

float類型的數值有一個后綴F或者f,沒有后綴F的浮點數值默認為double類型。

可以用十六進制表示浮點數值。例如0.125=2-3可以表示為0x1.0p-3,在16進制表示法中,使用p表示指數,而不是e,而且尾數采用16進制,指數采用10進制。指數的基數是2,而不是10。

所有的浮點數值計算都遵循IEEE754規范,用於表示溢出和出錯情況的三個特殊的浮點數值:正無窮大、負無窮大和NaN。

如果在數值計算中不允許有任何舍入誤差,這個使用就應該使用BigDecimal類了。

--------------------------------------類型轉換--------------------------------------

類型轉換可分為兩種,一種是自動類型轉換、另一種是強制類型轉換。

自動類型轉換

  自動類型轉換我們可以比擬為是“一人得道雞犬升天”。

  假如我們在對兩個數值進行二元操作,假如a是short類型的數值,b是int類型的數值,那么在進行計算的時候,a就會被轉換為int類型,所以得到的結果也是int類型的數據。

sum = a+b;

  所以我們可以知道,自動類型轉換的方向是從低到高的,類似於:

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

  在這里,可能會有一個疑問,為什么short和char要分開出來寫呢?它們不都是2個字節的嗎?

  原因是,short類型是有帶符號的類型,也就是說它有一個符號位,但是char沒有符號位,也就是說char和short類型雖然所占的內存大小一樣,但是所表示的范圍是不一樣的(char的表示范圍是0~2^16 - 1 (0 to 65535),short的表示范圍是 -2^15 to 2^15 - 1 (−32,768 to 32,767))。

強制類型轉換

  強制類型轉換就有點像是去菜市場菜販子會“抹零頭”那樣,在Java中允許進行可能會丟失一些信息的類型轉換,而這種情況就需要通過強制類型轉換來實現。

  強制類型轉換的語法格式是在圓括號中給出想要轉換的目標類型,后面緊跟待轉換的變量名。如:

double d = 2.3333; int i = (int)d;

  不過如果試圖將一個數值從一種類型強制轉換成另一種類型,而又超出了目標類型的表示范圍,結果就會截斷成一個完全不同的值。

  像是不要轉成boolean類型或者是byte類型。

--------------------------------------裝箱和拆箱--------------------------------------

裝箱和拆箱

  裝箱和拆箱是一對相對的概念。

  裝箱就是指把基本類型用它們相應的引用類型包裝起來,使其具有對象的性質。

  拆箱就是把引用類型的對象簡化成值類型的數據。

  舉個栗子:

Integer i = 10; //裝箱
int n = i;  //拆箱

  用javap -v反編譯一下就知道這兩條語句對應的是不是裝箱和拆箱了。

  然后我們分別看一下,Integer.valueOf方法和Integer.intValue方法的源碼:

    public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
    public int intValue() { return value; }

  裝箱的這個過程是不是有點熟悉?詳情可以看一下我之前寫的這篇筆記:https://www.cnblogs.com/NYfor2018/p/9482390.html

  而拆箱的過程是簡潔不加修飾,我們可以看到它的返回值直接就是int。

  但,是不是那八種基本類型的裝箱過程都是相似的呢?不是的,但是它們是跟前面的八種基本數據類型的分類情況是類似的,也就是Integer、Short、Long、Byte的裝箱過程,Double和Float的裝箱過程、Boolean的裝箱過程和Character的裝箱過程的分別類似的。

  下面祭上源碼:

public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } public static Long valueOf(long l) { final int offset = 128; if (l >= -128 && l <= 127) { // will cache
            return LongCache.cache[(int)l + offset]; } return new Long(l); } public static Short valueOf(short s) { final int offset = 128; int sAsInt = s; if (sAsInt >= -128 && sAsInt <= 127) { // must cache
            return ShortCache.cache[sAsInt + offset]; } return new Short(s); } public static Byte valueOf(byte b) { final int offset = 128; return ByteCache.cache[(int)b + offset]; }
public static Double valueOf(double d) { return new Double(d); } 

public static Float valueOf(float f) { return new Float(f); }
public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }
public static Character valueOf(char c) { if (c <= 127) { // must cache
            return CharacterCache.cache[(int)c]; } return new Character(c); }

  所以,在做有關於同種數據類型但是數值不一樣的面試題的時候,要對症下葯。

  有關於基本數據類型的面試題可以看這篇文章,寫的很不錯:https://blog.csdn.net/u010539271/article/details/69668807

 

-------------------------------------有道面試題-------------------------------------

byte b1=1,b2=2,b3,b6; final byte b4=4,b5=6; b6=b4+b5; b3=(b1+b2);
System.out.println(b3+b6);

問題:這代碼片段編譯之后會出現什么情況?

答案:語句:b3=b1+b2編譯出錯

因為b4和b5已經聲明是一個final常量了,所以它在進行運算的時候不會因為要運算而自動轉化成int類型(int類型轉換成byte需要強制轉換,),因此會編譯錯誤。
但是因為b4和b5在進行運算的時候不會自動轉換成int類型,所以在進行b6=b4+b5語句的時候不會出現錯誤。

-------------------------------------編碼那點事兒-------------------------------------

  值得回去再看看的文章:

  https://www.cnblogs.com/lslk89/p/6898526.html

  https://www.cnblogs.com/deepblue775737449/p/7604738.html

  https://www.cnblogs.com/web21/p/6092414.html

  https://blog.csdn.net/guxiaonuan/article/details/78678043

 

參考:

《Java核心技術I》

https://www.cnblogs.com/dolphin0520/p/3780005.html

https://blog.csdn.net/u010539271/article/details/69668807

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM