JAVA基本類型
8種基本數據類型
想要更多面試題和學習資料的能夠私聊聯繫我,你們一塊兒交流學習!面試
Java語言有8種基本數據類型, 分別用於存儲整數、浮點數、字符數據和布爾類型數據。須要注意的是: 如今所介紹的僅僅是基本數據類型,後續還會介紹不少非基本數據類型。基本數據類型如圖 – 1所示:
圖- 1
從圖- 1中能夠看出, 基本數據類型主要分爲4大類 (整數類型、浮點類型、char、boolean), 整數類型又分爲了4小類(byte、short、int、long), 浮點類型也分了2小類(float、double),這些數據類型的區別是怎樣的?經過圖– 2展現了這8種數據類型的存儲空間及使用場景:
圖- 2
在如上這8種數據類型中,最經常使用的有5種,分別爲int、long、double、char、boolean。其他的數據類型幾乎不用,要求對這5種基本數據類型重點掌握,其他的數據類型,有興趣瞭解就能夠了。ide
- int類型
2.1. int類型
int是最經常使用的整數類型,一個int類型的變量佔用4個字節,即32位的內存空間。Int的最大表示範圍爲:-231~231-1,即-2147483648 ~2147483647,大約正負21個億多些。
2.2. 整數直接量是int類型
所謂整數直接量(literal)就是直接寫出的整數,例如:下面的語句中,100就是直接量。
int a = 100;
關於整數直接量,須要注意以下要點:
整數的直接量的類型默認爲int類型,若是直接寫出的整數超過了int的表達範圍,將會出現編譯錯誤,下面的語句,就是由於超出了整數的範圍而致使的編譯錯誤。
int d = 10000000000; // 編譯錯誤10000000000這個數值寫出來就是錯誤的,由於Java認爲全部直接寫出的整數都是int類型,而這個數值超過了int的表達範圍。
除了一般的十進制數字形式,整數直接量也能夠寫成16進制的形式(以0X或0x開頭)或8進制的形式(以0開頭),請看以下直接量三種表現形式:
int a = 100000; // 10進制
int b = 0x186a0; // 16進制
int c = 0303240; // 8進制
2.3. 整型數據除法運算中的取整
若對兩個整數相除,會捨棄小數的部分(注意:不是四捨五入),結果也是整數。示例代碼以下所示:
int c = 5/3;
System.out.println(c); // c的值爲1,取整
int total = 87;
int error = 23;
int percent = error / total 100;
System.out.println(percent+"%"); //結果爲0%,23除以87整數部分爲0,乘以100,爲0
percent = 100 error / total;
System.out.println(percent + "%"); // 結果爲26%,230除以87整數部分爲26
2.4. 運算時要防止溢出的發生
當兩個整數進行運算時, 其結果可能會超過整數的範圍而發生溢出,正數過大而產生的溢出,結果爲負數;負數過大而產生的溢出,結果爲正數。示例代碼以下所示:
int a = 2147483647; //int類型整數的上限
int b = -2147483648; //int類型整數的下限
a = a + 1;
b = b - 1;
System.out.println("a=" + a); //輸出結果: a=-2147483648 溢出,結果錯誤。
System.out.println("b=" + b); //輸出結果: b=2147483647溢出,結果錯誤。
- long類型
3.1. long類型
在表示整數時,若是int類型的範圍不夠,可使用long類型,一個long型的變量佔用8個字節(即64位),最大表示範圍爲:-263 ~ 263-1,即 -9223372036854775808 ~ 9223372036854775807。
若是要表示long直接量,須要以 L 或 l 結尾。示例代碼以下:
long a = 10000000000; //會有編譯錯誤,由於10000000000編譯器認爲是int類型,而這個值,已經超出了int的範圍
long b = 10000000000l; //正確
3.2. 使用long類型進行較大整數的運算
對於較大的整數運算(超過int的表達範圍),可使用long型。示例代碼以下:
long distance1 = 10000 365 24 60 60 299792458l;
//必須有一個long型數據參與的運算結果纔是long型
System.out.println("distance1="+distance1);//distance1=547836957965889536 結果正確
long distance2 = 10000 365 24 60 60 299792458;
System.out.println("distance2="+ distance2); //distance2=-1973211136 溢出,=號後面的數據默認爲int類型,超出了範圍,發生溢出。
3.3. 經過時間毫秒數來存儲日期和時間
JDK提供 System.currentTimeMillis() 方法,返回1970年1月1日零點到此時此刻所經歷的毫秒數,數據太大,故其數據類型爲long。示例代碼以下:
long time = System.currentTimeMillis();
System.out.println(time); //輸出的結果爲: 1383835712828
經過上面的代碼能夠看出,輸出的結果已經超出int類型的最大值,所以,JDK設計的返回類型爲long型,該方法經常被用於計時操做。
- double類型
4.1. 使用double進行浮點數的運算
前面所學習的int、long都是用於存儲整數的,小數即爲浮點數,包括: float(單精度)和double(雙精度),double類型的精度值是float類型的兩倍,所以而得名雙精精,在實際的應用開發中,float應用極少,大多數場合使用double表示浮點數。示例代碼以下:
double pi = 3.14;
double r = 8;
double s = pi r r;
System.out.println("s=" + s); // 輸出的結果爲:s=200.96
4.2. 浮點數直接量是double類型
浮點數的直接量有兩種寫法:1)一般寫法,如:3.1四、31四、0.一、.5。 2)科學計數法,如:1.25E二、1.25e二、1.25E-2。其中,1.25E2表示1.25乘以10的2次方。
默認的浮點直接量爲double型,若是須要表示float類型的直接量,須要加「f」或「F」後綴。例如:
float f1 = 3.14 //編譯錯誤,應該寫成3.14f
4.3. double運算時會出現舍入偏差
2進制系統中沒法精確的表示1/10,就好像十進制系統中沒法精確的表示1/3同樣,
因此,2進製表示10進制會有一些舍入偏差,對於一些要求精確運算的場合會致使代碼的缺陷。示例代碼以下所示:
double money = 3.0;
double price = 2.9;
System.out.println(money - price); //輸出的結果是: 0.10000000000000009
若是須要精確的運算能夠考慮放棄使用double或float而採用BigDecimal 類來實現。關於這一點,將在後續的章節中介紹。
- char類型
5.1. char類型
字符類型char事實上是一個16位無符號整數(都是正數),這個值是對應字符的編碼,Java字符類型採用Unicode字符集編碼(通用碼、統一碼、萬國碼),而Unicode是世界通用的定長字符集,全部的字符都是16位來表示。例如:字符a實際的值爲97,字符A實際的值爲65,字符0實際的值爲48。
字符直接量能夠採用諸如:‘中’的形式,也能夠採用16進制的表示形式,例如: ‘\u4e2d’,代碼以下所示:
char c1 = ‘中’; //c1中存的是」中」的編碼
char c2 = '\u4e2d'; //‘4e2d’爲‘中’所對應的16位Unicode編碼的16進製表示形式
System.out.println(c1);
System.out.println(c2);
如上代碼的輸出結果:c1的值爲中,c2值也爲中,但c1和c2內部存儲的實際上是」中」這個字符所對應的Unicode碼,即:一個無符號的整數。
5.2. 對char型變量賦值
在對char型變量賦值時,能夠採用以下三種方式:
方式一:
字符直接量:形如‘A’,變量中實際存儲的是該字符的Unicode編碼(無符號整數值),一個char型變量只能存儲一個字符。示例以下:
char c1 = 'A';
方式二:
整型直接量:範圍在0~65535之間的整數,變量中實際存儲的即該整數值,但表示的是該整數值所對應的Unicode字符。示例以下:
char c2 = 65;
Unicode形式:形如‘\u0041’,Unicode字符的16進制形式。示例以下:
char c3 = '\u0041';
5.3. 使用轉義字符
字符直接量須要包含在一對’’單引號之中,那若是想表示單引號’的字符時,須要怎麼表示?想表示回車、換行符時,怎麼表示?
由於單引號爲特殊意義的字符, 那麼,對於不方便輸出的字符能夠採用轉義字符來表示,示例代碼以下:
char c = '\';
System.out.println(c); //輸出的結果爲:\
經常使用轉義字符以下圖 – 2所示:
圖- 2
- boolean類型
6.1. 使用boolean變量進行關係運算
boolean類型適用於關係、邏輯運算, 表示某個條件是否成立, 只容許取值true或false,true表示條件成立, 而false表示條件不成立。
boolean型變量常常用於存儲關係運算的結果,所謂關係運算就是比較兩個變量的大小相等等關係(此知識點,後續詳細介紹)。boolean示例代碼以下所示:
int age = 18;
boolean isChild = age<16;
System.out.println(isChild); // isChild的值爲false
boolean running = true;
boolean closed = false;
- 基本類型間轉換
7.1. 類型間轉換
不一樣的基本類型直接能夠相互轉化,主要有兩種方式:
自動類型轉化(隱式類型轉換):從小類型到大類型能夠自動完成。類型的大小關係以下圖 - 3所示:
圖- 3
強制轉化:從大類型到小類型須要強制轉換符,語法以下:
(須要轉換成的類型)變量
由於大類型的精度值大於小類型,取值範圍大於小類型,因此,當使用強制轉化時,有可能會形成精度的損失或者溢出,因此,在使用強制轉化時要求顯式的告訴編譯器,正在進行強制轉換。
7.2. 強制轉換時的精度喪失和溢出
基本類型轉化以下示例所示,注意強制轉換時可能會形成的精度喪失和溢出。
int a = 100;
int b = 200;
long c = a + b; //自動將int轉化爲long
long l1 = 1024l;
int i = (int) l1; //須要增強制轉化符因爲1024在int的範圍內,因此沒有產生溢出
long l = 1024L 1024 1024 4;
int j = (int) l; //會產生溢出
System.out.println(j); // 結果爲:0
double pi = 3.1415926535897932384;
float f = (float) pi; //會形成精度的損失,由於單精度的精確度小於double
System.out.println(f); //結果爲:3.1415927
7.3. 數值運算時的自動轉換
若是在一個表達式中出現了多種數據類型,則運算結果會自動的向較大的類型進行轉化,
示例以下:
//因爲有long型的直接量參與,整個表達式的結果爲long
long distance = 10000 365 24 60 60 299792458l;
//因爲有double型的直接量599.0參與,整個表達式的結果爲 double
double change = 800 - 599.0;學習
//結果爲0.0,右邊都是int型數據運算結果也爲int類型,結果爲0,再賦值給double
將0轉化爲 0.0
double persent1 = 80 / 100;
//結果爲0.8,右邊表達式有double型直接量參與, 運算結果爲double型
double persent2 = 80.0 / 100;
7.4. byte、char、short轉換爲int
在前面所介紹的8種數據類型中,byte、char、short、int、long都表示整數類型,而整型的直接量爲int,在實際使用中,爲了方便使用,遵循了以下的規則:
int直接量能夠直接賦值給byte、char和short,只要不超過其表示範圍。示例以下:
byte b = 97;
short s = 97;
char c = 97;
byte、char、short三種類型參與運算時,先一概轉換成int類型再進行運算。示例以下:
byte b = 97;
int num = b + b; //num的值爲194編碼