Java基礎(chǔ)篇——基本數(shù)據(jù)類型
作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號:《程序猿技術(shù)大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗,樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項目的研發(fā)工作,涉及架構(gòu)設(shè)計、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗。
1、基本數(shù)據(jù)類型:(8種基本數(shù)據(jù)類型)
4個整型:int short long byte 默認類型:int
2個浮點型:double float 默認類型:double
1個字符型:char
1個布爾型: boolean
注:在使用每種數(shù)據(jù)類型時,切記不要超過其取值范圍,以免出現(xiàn)溢出異常!
1>、整型
整數(shù)在內(nèi)存空間中是按照其補碼存儲的,如:
-1存儲在一個byte中為:1111 1111
127存儲在一個byte中為:0111 1111
-128存儲在一個byte中為:1000 0000
則整數(shù)在存儲時,把最高位當(dāng)做符號位來處理了,于是也就解釋了其各種整型類型的取值范圍的由來。
類型
存儲要求
取值范圍
int
4字節(jié)(32bit)
-2^31---2^31-1
shor
2字節(jié)(16bit)
-2^15—2^15-1
long
8字節(jié)(64bit)
-2^63—2^63-1
byte
1字節(jié)(8bit)
-2^7—2^7-1
整型默認的數(shù)據(jù)類型為int ,如:long a = 127; 127就是int型的,它最終經(jīng)過自動類型轉(zhuǎn)換了。
實例分析:
int size=1024*1024*1024*2;
System.out.println(size);//-2147483648
由于int型最大取值為2G-1,則size取值溢出了,但此時編譯時卻不會報錯,為何?因為這種int size=1024*1024*1024*2 寫法騙過了編譯器(編譯器編譯時只是分別檢測1024、1024、1024、2的值,而不加以對其運算后再做出判斷是否溢出),使得編譯器不會報錯。可size的輸出結(jié)果順利成章的就是-2147483648(溢出導(dǎo)致結(jié)果為負值了)。對于int size = 2147483648;(2147483647=1024*1024*1024*2)這種方式的聲明,編譯器就會報錯了,2147483648顯然超過了int型的范圍,即溢出了。(int size=1024*1024*1024*2 和int size = 2147483648在分配內(nèi)存時是不同的哦!)
2>、浮點型 float double
浮點型默認的類型為:double,如 2.9就屬于double型
注意:3 3L 3D 3F是完全不同的幾個數(shù)值
float和double都是按照浮點數(shù)存儲規(guī)則來存儲的,這種存儲方式并不能精確的表示數(shù)值,它們的取舍都是按照二進制數(shù)進行取舍的。
不要打算比較兩個浮點數(shù)是否相等,雖然語法沒錯,但是由于它們本身就是不精確的,將會得到不正確的判斷結(jié)果,因此可以用這兩個浮點數(shù)之差的絕對值是否小于一個足夠小的數(shù)來進行判斷。如:
double a = 1.2;
double b = 2.0-0.8;
if(Math.abs(a-b)<1e-6){
System.out.print("a=b");
}
3>、字符型 char
Char類型其實也是一種整形,它與short的唯一區(qū)別是char無符號,它可以參與整數(shù)的所有運算。
2、類型轉(zhuǎn)換
1>、自動類型轉(zhuǎn)換
如:int a = 'A';
轉(zhuǎn)換原則:低精度(小范圍)類型向高精度(大范圍)類型自動類型轉(zhuǎn)換
即:byte->short->int->long->float->double
2>、強制類型轉(zhuǎn)換
如:int a=127;
byte bx=(byte)a;
而:byte bx=a; //錯 無法自動類型轉(zhuǎn)換
強制轉(zhuǎn)化可能有數(shù)據(jù)和精度的丟失或異常,也有可能改變數(shù)據(jù)的正負性,如:
byte b = (byte)0x1ff;
System.out.println(b); //-1
3、運算符
1〉、算術(shù)運算符:+ - * / % += -= ……
· 當(dāng)除法“/”運算時,兩個數(shù)都是整數(shù),表示整數(shù)除法,結(jié)果為整數(shù),反之表示浮點除法,如:9/2=4 ,9.0/2=4.5
·大多數(shù)人認為:a+=4是a=a+4的簡寫形式,是完全等價的,其實不然,它們并不完全等價,它們一個使用簡單賦值運算,一個使用復(fù)合賦值運算,而簡單賦值運算和復(fù)合賦值運算的最大差別就在于:復(fù)合賦值運算會自動地將運算結(jié)果轉(zhuǎn)型為其左操作數(shù)的數(shù)據(jù)類型。如:
a、byte a = 4;
a+=1;
b、byte a = 4;
a = a+1;
方法a的寫法編譯時是沒有問題的,而b寫法卻編譯不通過。原因就在于,當(dāng)使用復(fù)合賦值運算符進行操作時,即使右邊算出的結(jié)果是int型,系統(tǒng)也會將其轉(zhuǎn)化為左邊的byte類型,而使用簡單賦值運算時沒有這樣的優(yōu)待,系統(tǒng)就會將a+1的值賦給a是將int類型賦給byte,所以要求強制轉(zhuǎn)化。理解了這一點后,再看看這個:
byte b = 120;
b+=20;
System.out.print("b="+b);
然而,輸出結(jié)果b=-116,而不是140。因為120+20的值已經(jīng)超過了byte的范圍,而當(dāng)我們使用復(fù)合賦值運算時系統(tǒng)會自動作類型的轉(zhuǎn)化,將140強制轉(zhuǎn)化成byte,所以得到的是-116.由此可見,在使用復(fù)合賦值運算時一定要小心哦,因為這種類型的轉(zhuǎn)化是在不知不覺中進行的,所以得到的結(jié)果就有可能和你預(yù)想的不一樣了。
2〉、關(guān)系與邏輯運算: >、 >= 、 <、<=、 !=、|、||、&、&&
& | 是非短路運算
&& || 是短路運算
短路運算:如果第一個表達式已經(jīng)能夠判斷其值,則第二個表達式就不必要判段了。
常用于短路運算&& ||
3〉、自增運算符:++ , --
i++ ,先將i的值作為整個表達的值,然后將i增加1
++i,先將i增加1,然后將i的值作為整個表達的值
如:
int a = 1;
int b = 1;
b =a++; //b=1 ,a=2
(關(guān)于++運算符,++構(gòu)成了C++語言的名稱,在此也引起了一個笑話。C++的反對者認為C++的名稱本身就存在bug,應(yīng)該是++C,他們認為:"只有對它改進之后,才可以使用它,所以它的名字應(yīng)該命名為++C"。說這個笑話也就是為了更好的理解++運算符的使用,增添一點笑料罷了,O(∩_∩)O~?。?br>
++運算符常可以模仿發(fā)牌過程:
int i = 0;
int a = i++%5;//a=0
a = i++%5;//a=1
a = i++%5;//a=2
a = i++%5;//a=3
a = i++%5;//a=4
a = i++%5;//a=0
a = i++%5;//a=1
a = i++%5;//a=2
a = i++%5;//a=3
a = i++%5;//a=4
4〉、條件運算符:(三目運算符)
(布爾表達式)?(true表達式):(false表達式)
如:
//計算分頁數(shù)量
int rows = 23;//數(shù)據(jù)行數(shù)
int size = 10;//每頁行數(shù)
int pages;//頁數(shù)
pages = rows%size==0 ? rows/size : rows/size+1;
5>、位邏輯運算符:& | ^ ~
在處理整型數(shù)值時,可以直接對組成整型數(shù)值的各個位進行操作。這就意味著可以屏蔽技術(shù)獲得整數(shù)中的各個位。