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