java資料型別與運算子
- 資料型別
- 基本資料型別
- java資料型別使用的常犯錯誤
- 整數的默認型別和浮點數的默認型別
- 過大資料的存盤和資料型別的轉換
- 整型提升(針對小于四位元組的運算)
- 算術轉換
- char型別來表示漢字
- boolean 與整形能不能進行相互轉換?
- java中也能對浮點數進行取模運算嗎?
- 參考資料型別
- string類
- 數字轉字串
- 字串轉數字
- 運算子
- 算術運算子
- 如何保留小數
- 0不能作為除數
- 關于負數的除法取模
- +=,-=,++,-- 的特點
- 避免產生型別沖突
- 前置++,-- 和后置++,--的區別
- 關系運算子
- 邏輯運算子
- 短路運算
- 位運算子
- 移位運算子
- 條件運算子
資料型別
下面附上一張java資料型別的表,以便讀者形成整體的觀念,

基本資料型別
這里我給讀者一張關于java的資料型別的表,這樣更加方便你們閱讀和查看

以上就是java的八大基本資料型別
對于上述表中,大概有幾點需要注意:
1. java中所參照的字符表不再是ASCII碼表,而是Unicode表
2. 包裝類是啥 ?這個在我之后的博客會繼續講解,這里只需記住它們各自的包裝類就好了
3. java中的 byte,short, int, long 沒有無符號數這種概念,它們均為有符號數,即最高位為符號位,剩下的都是數值位
4. java中的char型別無負數,即你不能將一個 -1 賦值給一個char型別(會報錯,C語言中就不會報錯)
5. 除了 int 和 char 對應的包裝類需要特殊記憶,其他資料型別的包裝類就只是首字符大寫就完事了
6. 位元組大小數里 char 和 C 相比發生了改變,還新增了byte 和 boolean ,以及 java中的資料型別是固定的(java語言的可移植性)
7. boolean 是啥?它又叫布爾型別,它只能取 true 或者 false 這兩個值(不像C語言中0為假,非零為真, java中具體的給出了這種型別)
java資料型別使用的常犯錯誤
整數的默認型別和浮點數的默認型別
int a =10;
long b =10;
float c= 10.0;
double d= 10.0;
在上述代碼中,第三行會報錯,為什么呢?因為整數默認型別為 int 型別,而浮點數默認型別為 double 型別,因此,在第三行的時候,就相當于把一個double型別賦值給一個float型別,就會發生資料的截斷而出錯,至于第二行代碼為什么沒出錯是因為將一個int型別賦值給一個long型別是小型別賦值給大型別,因此不會出錯,
但是,為了代碼的安全性,在讀入一個long和float型別的時候,我們可以在整數后面加一個L(大小寫均可),在浮點數后面加一個F(也是大小寫均可),如下面代碼
int a =10;
long b =10L;
float c= 10.0F;
double d= 10.0;
過大資料的存盤和資料型別的轉換
byte a =128;
int b = 2147483648;
以上兩行代碼均會報錯,因為java是一種強型別的語言,會對右邊將要賦值的資料進行檢查,如果超過了所能存盤的范圍,那么它將報錯,
再看以下代碼
byte c = 30+30;
byte b = 127+1;//錯誤代碼(注:127是byte所能存盤的最大值)
int a= 2147483647+1;//(注:2145483647)
這三行代碼里面只有第二行代碼出錯了,為啥?為什么第三行代碼存盤的值也超過的存盤的范圍,但是不報錯?
對于這個問題我們分兩種情況進行討論()
第一種,賦值給小于四位元組的
第二種,賦值給大于四位元組的
在討論之前,我們就現需要了解整形提升和算術轉換的含義
整型提升(針對小于四位元組的運算)
看如下代碼
byte h = 10;
byte i = 21;
byte m = 10+21;
byte b = 127+1;//錯誤代碼
byte j = h+i;//錯誤代碼
byte k = h+1;//錯誤代碼
為啥上面最后三行代碼會發生錯誤?出錯的原因如下圖

因為當進行 h+i 這個運算的時候,計算機發現這是兩個小于4位元組的變數在進行計算,因此會將它們的資料型別提升為四位元組的整形,至于為啥是四位元組,是因為計算機總是以4位元組的形式來拿取資料,提升為四位元組是為了提升計算機的作業效率,
注意剛才我說的是變數在進行計算,你可以這樣來理解,即計算機不知道這個變數到底存了些什么,它只知道這個變數只有兩個位元組,然后就將它提升為四個位元組,以提高作業效率,
但為什么第三行代碼又對,第四行代碼 byte b = 127+1又錯呢?
則會使因為java對右邊的資料進行了數值大小的檢查,它檢查到數值超過了所能存盤的最大值的時候就會將這個較大的數歸屬于存盤范圍更大的整形,因此,第四行代碼也會發生型別的沖突,而第三行不會,
算術轉換
和整形提升差不多,算術轉換是更高位元組之間的轉換,但是依然像整型提升一樣滿足低轉高
int a =4;
double c= a/1.0;
我們知道1.0默認的是double型,而當一個整形和一個double型進行運算的結果就會屬于一個double型
總之,對于整形提升和算術轉換我們記住這幾點就好
1.整型提升和算術轉換時自動發生的
2.整型提升和算術轉換都是小轉大,不過整形提升時小于4位元組的都提升為4位元組的整形(注意char型別也會哦),而算術轉換時根據運算元 的資料型別來轉換,
到這,我們了解了整形提升和算術轉換,我們在繼續剛才的兩種情況吧
第一:小于四位元組的運算
1.如果等號右邊只有數值沒有變數,會自動檢查等號右邊的數值
如果只有一個字面常量(不用運算)且大于范圍,那么它會直接報數值過大的錯誤
如果是運算后的結果大于范圍,那么它將會把運算后的結果設定為int型別,然后導致型別沖突發生錯誤,
2. 如果等號右邊有變數,那么將會發生整形提升,然后導致型別沖突
第二:大于四位元組的運算
1.如果等號右邊只有一個字面常量且大于范圍,那么它將會直接報錯,
2.如果有位元組更大的變數,那么將會發生算術轉換,
如果沒有,只是單純的數值運算,結果超出范圍,像下面這樣
int a= 2147483647+1;//結果是-2147483648
那么它將會進入一個數值的回圈,不會出錯,如下圖

即-1+1=0,2147483647+1=-2147483648,這樣回圈著來,也就有了為啥剛剛代碼的結果,
其實byte里面也有這樣的操作,但是不太容易出現,會有整型提升等很多問題直接報錯,看下面的代碼
short a =128;
byte b =(byte) a;
128已經超過了byte的范圍了,128 = 127+1,如下圖,這里的 b 應該是-128

到這,關于這個小知識點的講解大概就完結了,我們再來總結三點
1.這些數值型別都存在如上圖這樣的回圈,但是byte這樣小于四位元組的數字往往會由于整型提升或者其他原因直接報錯,但是int long這樣的資料型別就經常會發生這樣數值的回圈特性,
2.所有型別,如果直接賦值給一個超過范圍的字面常量都是會直接報錯的,,如果不是直接賦值一個字面常量,那么就具體問題具體分析,
3.了解小轉大的整型提升和算術轉換,當然,如果你想大轉小那么強制轉換就行
char型別來表示漢字
這是一個小知識點,一個漢字的大小是兩個位元組,在java中char型別也剛好是兩個位元組,
因此,java中的char型別剛好能表示一個漢字,C語言中則不能,
boolean 與整形能不能進行相互轉換?
答案是不能,java中故意設定boolean這種型別的變數就是為了和C語言中用數字非零與否判斷真偽的方式區別開來,因此我們不能寫下面這樣的代碼
boolean a =0;
boolean b =1;
只能寫如下這樣的
boolean a = true;
boolean b = false;
java中也能對浮點數進行取模運算嗎?
答案也是可以的,在C語言中,我們只能對整數進行取模運算,而在java中,我們對浮點數也能進行取模運算,如下圖代碼
double a = 10 % 3.0;
至于為什么要用double型別,上文也已經提到過,1.0是默認double型別,所以運算之后也會默認轉換為double型別
參考資料型別
string類
我們這里只介紹一種參考資料型別,那就是字串型別
String arr = "abcdef";
創建方式很簡單,為什么叫參考型別呢?因為String是在java.lang包的一個String類,
我們的java程式會自動參考java.lang包,所以可以直接使用,
下面介紹字串轉換成數字和數字轉換成字串的方法
數字轉字串
方法一:拼接上一個空字串然后變成字串,例如
int a=29;
String string = a+"";
方法二:采用String類的一個叫valueOf的方法,如下
int a =29;
String string = String.valueOf(a);
字串轉數字
用整形包裝類下面的一個方法:
String string = "123456";
int num = Integer.valueOf(string);
運算子
算術運算子
算術運算子包含 ’ + ‘,’ - ‘,’ * ‘,’ / ‘,’%’(加,減,乘,除,取模)
自增自減運算子:+=,-=,++,–
這里需要注意的一點是關于除法的運算
如何保留小數
下面給出一段代碼
System.out.println(5/2);//結果為2
System.out.println(5/2.0);//結果為2.5
System.out.println(5.0/2);//結果為2.5
System.out.println((float)5/2);//結果為2.5
System.out.println(5/(float)2);//結果為2.5
System.out.println((float)(5/2));//結果為2.0
從上面的代碼以及上文對于一個整數和一個浮點數默認的資料型別來看
我們可以發現:
如果不需要保留小數,那么直接用整數之間的除法就可以,如果需要保留小數,至少要保證運算子左右兩邊至少有一個浮點數
0不能作為除數
int a = 10/0;
這段代碼編譯時就會報出下面的例外

關于負數的除法取模
下面給出一些例子
System.out.println(-10/3);//結果為-3
System.out.println(10/-3);//結果為-3
System.out.println(-10/-3);//結果為3
System.out.println(-10%3);//結果為-1
System.out.println(10%-3);//結果為1
System.out.println(-10%-3);//結果為-1
我們可以看到負數的除法和我們正常計算的情況一樣,那么負數的取模運算呢?
假如-10%3 或者 -10%-3,我們先商一個 -3 或者 3,那么-10-(-9)或者- 10 - (-9)結果都是剩-1,這個運算很簡單,讀者可以自己去試一試,
+=,-=,++,-- 的特點
避免產生型別沖突
通過上文的閱讀我們知道下面的代碼時會發生整形提升然后報錯
byte a =10;
a = a + 1;//這里會發生型別的沖突
short b =11;
b = b + 1;//這里也會發生型別的沖突
如果我們使用 a+=1 , b+=1 這樣的代碼就不會出錯,如
byte a =10;
a++;
a+=10;
a--;
a-=2;
所以對于小于4位元組的變數的自增自減,我們可以使用+=或者-=,避免產生型別沖突,
前置++,-- 和后置++,–的區別
int a =10;
int b=a++;//這里a先賦值給b,再自增為11
int c=++a;//這里a先自增為12,再賦值給c
System.out.println(a);//最終a為12
System.out.println(b);//b為10
System.out.println(c);//c為12
由上圖代碼我們可以知道,前置++和后置++的區別就是,前置會先進行自增,再回傳,后置則是先回傳,再自增,
而–和++是同樣的方式操作,
當然如下圖代碼
int a=10;
a++;
++a;
這樣不需要回傳值的時候,二者就沒有區別,
關系運算子
關系運算子有:’ == ’ ,’>=’, <=, >, <, !=(等于,大于等于,小于等于,大于,小于,不等于)
這里和C語言差不多,唯一要注意一點是不要把’=’ 看成 ‘==’,前者是賦值符號,后者是等號
邏輯運算子
邏輯運算子有&&,||,!,&,|(短路與,短路或,邏輯非,邏輯與,邏輯或)
這里和C語言有個區別,那就是java多了兩個邏輯運算子 & 和 | ,與 && 和 || 之間的區別就是
前者不支持短路運算,而后者和C語言一樣支持短路運算
短路運算
因為與的規則是只有運算子兩邊的布爾運算式均為true,結果才為true,只要左邊的運算子為false,那么無論右邊的運算子結果是多少,結果都是false,所以只要左邊的滿足false,那么短路與&&這個運算子將不會檢查右邊的代碼,
如下圖代碼
if(!(20<10 && 10/0==0))
System.out.println("world");
結果會列印world,并不會報錯,原因是20<10為false,那么結果一定為false,所以也就沒有檢查右邊的錯誤代碼
同理,或的規則是只要有true,那么結果一定為true,短路或 || 也就不會去檢查右邊的代碼,
if( 20>10 || 10/0==0)
System.out.println("hello");
這里會輸出hello,因為20>10為true,短路與運算子也就不會去檢查右邊的代碼,
位運算子
位運算子主要有:’&’ , ‘|’ , ‘~’, ‘^’(與,或,取反,異或)
啥叫位運算子呢?
因為資料在計算機里面都是以二進制進行存盤的**,位運算子就是對于二進制中的每一位進行位操作**,
按位與:兩個二進制位都為1,那么結果為1,否則結果為0,
按位或:兩個二進制位都為0,那么結果為0,否則結果為1,
按位取反:如果該位為0,那么轉為1,如果該位為1,那么轉為0
按位異或:兩個二進制數相同為0,相異為1
對于某一位資料來說,你與上一個0,相當于置0,因為結果一定是0,那么你與上一個1呢?原資料相當于不改變,是1還是1,是0還是0,
因此我們可以總結一下
與0=置0,與1=不變
或0=不變,或1=置1
對于異或:
0^n=n, 0 異或任何數都是任何數,不改變,
移位運算子
移位運算子有三個:<<,>>,>>>(左移,右移,無符號右移)
‘<<’: 左移的規則是位左移之后,在后面補0, 左移N位相當于乘于2的N次方
‘>>’: 右移的規則是位右移之后,在前面補符號位 右移N位相當于除于2的N次方
‘>>>’:無符號右移的規則是右移之后,在前面補0
條件運算子
條件運算子只有一個:布爾運算式?代碼1:代碼2 (又叫三目運算子)
如果這個布爾運算式為真,那么就會執行代碼1,否則會執行代碼2,舉個例子
int a = 10;
int b = 20;
int c = 30;
int max = c>(a>b?a:b)?c:(a>b?a:b);//(a>b?a:b)來找出ab之間的最大值,又和c比較,找出三者之間的最大值
System.out.println(max);
這樣一段代碼就找出了三者之間的最大值,
到這,今天我們關于java的資料型別和運算子的講解就告一段落,如有問題,歡迎指正,想和我一起學習java的小伙伴記得關注我,我之后也會陸續發布關于java的知識點博文,一起加油吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272525.html
標籤:其他
上一篇:完整版后端三層架構
