Java之基本數據類型

本文章分爲四個部分:html

一、基本數據類型的介紹java

二、類型轉換web

三、裝箱和拆箱面試

四、有道練習編碼

五、增:編碼的那點事兒spa

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

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

類型htm

boolean對象

char

byte

short

int

long

float

double

存儲需求(字節)

1

2

1

2

4

8

4

8


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

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

二、char類型本來用於表示單個字符,不過如今有些Unicole字符能夠用一個char值描述,另一些Unicole字符能夠用兩個char值。

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

  並且Unicode轉義序列會在解析代碼以前獲得處理。

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

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

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

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

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

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

在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語句的時候不會出現錯誤。

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

  值得回去再看看的文章:

  http://www.javashuo.com/article/p-vgcrleny-gd.html

  http://www.javashuo.com/article/p-nzbbxosr-ex.html

  http://www.javashuo.com/article/p-grzrtveo-er.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

相關文章
相關標籤/搜索