1. 程式人生 > >Java學習筆記一:數據類型I

Java學習筆記一:數據類型I

als 文件 我們 必須 64位 oid 編碼 不兼容 字符型

  GitHub代碼練習地址:https://github.com/Shamlee/JavaPractice/blob/master/IntPractice1.java

            https://github.com/Shamlee/JavaPractice/blob/master/IntPractice2.java

  Java語言是靜態類型的(statical typed),也就是說所有變量和表達式的類型再編譯時就已經完全確定。由於是statical typed,導致Java語言也是強類型(Strong typed)的。強類型意味著每個變量都具有一種類型,每個表達式具有一種類型,並且每種類型都是嚴格定義的,類型限制了變量可以hold哪些值,表達式最終產生什麽值。同時限制了這些值可以進行的操作類型以及操作的具體方式。所有的賦值操作,無論是顯式的還是在方法調用中通過參數傳遞,都要進行類型兼容性檢查。

一、基本數據類型:

byte:Java中最小的數據類型,在內存中占8位(bit),即1個字節,取值範圍-128~127,默認值0

short:短整型,在內存中占16位,即2個字節,取值範圍-32768~32717,默認值0

int:整型,用於存儲整數,在內在中占32位,即4個字節,取值範圍-2147483648~2147483647,默認值0

long:長整型,在內存中占64位,即8個字節-2^63~2^63-1,默認值0L

float:浮點型,在內存中占32位,即4個字節,用於存儲帶小數點的數字(與double的區別在於float類型有效小數點只有6~7位),默認值0

double:雙精度浮點型,用於存儲帶有小數點的數字,在內存中占64位,即8個字節,默認值0

char:字符型,用於存儲單個字符,占16位,即2個字節,取值範圍0~65535,默認值為空

boolean:布爾類型,占1個字節,用於判斷真或假(僅有兩個值,即true、false),默認值false

1 整型

  整型有byte short int long char,分別用8、16、32、64、16bits表示。有些地方可能不會把char列入整型範疇,但本質上char類型是int的一個子集。整型的寬度不應該被看成整數所占用的內存空間大小,而應當理解成定義為整型的變量或者表達式的行為。JVM可以自由使用它們希望的、任何大小的內存空間,只要類型的行為符合規範。byte short int long都是有符號的,用2的補碼(two‘s-complement)表示。而char用16位表示,它是無符號的,表示的是UTF-16編碼集。

2 byte

  byte由1個字節8位表示,是最小的整數類型。主要用於節省內存空間關鍵。當操作來自網絡、文件或者其他IO的數據流時,byte類型特別有用。取值範圍為:[-128, 127]. byte的默認值為(byte)0,如果我們試圖將取值範圍外的值賦給byte類型變量,則會出現編譯錯誤,例如 byte b = 128;這個語句是無法通過編譯的。一個有趣的問題,如果我們有個方法: public void test(byte b)。試圖這麽調用這個方法是錯誤的: test(0); 編譯器會報錯,類型不兼容!!!我們記得byte b =0;這是完全沒有問題的,為什麽在這裏就出錯啦?

  這裏涉及到一個叫字面值(literal)的問題,字面值就是表面上的值,例如整型字面值在源代碼中就是諸如 5 , 0, -200這樣的。如果整型子面子後面加上L或者l,則這個字面值就是long類型,比如:1000L代表一個long類型的值。如果不加L或者l,則為int類型。基本類型當中的byte short int long都可以通過不加L的整型字面值(我們就稱作int字面值吧)來創建,例如 byte b = 100; short s = 5;對於long類型,如果大小超出int所能表示的範圍(32 bits),則必須使用L結尾來表示。整型字面值可以有不同的表示方式:16進制【0X or 0x】、10進制【nothing】、八進制【0】2進制【0B or 0b】等,二進制字面值是JDK 7以後才有的功能。在賦值操作中,int字面值可以賦給byte short int long,Java語言會自動處理好這個過程。如果方法調用時不一樣,調用test(0)的時候,它能匹配的方法是test(int),當然不能匹配test(byte)方法,至於為什麽Java沒有像支持賦值操作那樣支持方法調用,不得而知。註意區別包裝器與原始類型的自動轉換(anto-boxing,auto-unboxing)。byte d = ‘A‘;也是合法的,字符字面值可以自動轉換成16位的整數。

  對byte類型進行數學運算時,會自動提升為int類型,如果表達式中有double或者float等類型,也是自動提升。所以下面的代碼是錯誤的:

3 int

  32 bits, [- 2^31, 2^31 - 1].有符號的二進制補碼表示的整數。常用語控制循環,註意byte 和 short在運算中會被提升為int類型或更高。Java 8以後,可以使用int類型表示無符號32位整數[ 0, 2^31 - 1]。

4 long

  64 bits, [- 2^63, 2^63 - 1,默認值為0L].當需要計算非常大的數時,如果int不足以容納大小,可以使用long類型。如果long也不夠,可以使用BigInteger類。

5 浮點類型

包含單精度的float和雙精度的double,分別用32、64bits表示,遵循IEEE 754規範。

6 double

64為表示,將浮點子面子賦給某個變量時,如果不顯示在字面值後面加f或者F,則默認為double類型。java.lang.Math中的函數都采用double類型。

如果double和float都無法達到想要的精度,可以使用BigDecimal類。

Java學習筆記一:數據類型I