運算符是一些特殊的符號,主要用於數學函數,一些類型的賦值語句或邏輯比較方面。Java 中的運算符分為以下幾類。
一、算數運算符
算數運算符包括: | |
+ | 加法運算,字符串連接運算 |
- | 減法運算 |
* | 乘法運算 |
/ | 除法運算 |
% | 取模運算,兩個數字相除取余數(只看被模數的正負號) |
++、-- | 自增自減運算 |
Tips:
-
- Java中,整數使用以上運算符,無論怎么計算,也不會得到小數。
- 一旦運算當中有不同類型的數據,那么結果將會是數據類型范圍大的那種。
1、除法和取模運算
對於一個整數的表達式來說,除法用的是整除,整數除以整數,結果仍然是整數。只看商,不看余數。
只有對於整數的除法來說,取模運算符才有余數的意義。而且 被模數%模數,只看被模數的正負號
5 % 2 = 1
-5 % 2 = -1
5 % -2 = 1
-5 % -2 = -1
2、加號“+” 的用法
(1) 對於數值來說,那就是加法。
(2) 對於字符 char 類型來說,在計算之前,char會被提升成為int,然后再計算。char類型字符,和int類型數字,之間的對照關系表:ASCII、Unicode
(3) 對於字符串 String 來說,加號代表字符串連接操作。任何數據類型和字符串進行連接的時候,結果都會變成字符串
3、自增運算符(++)和自減運算符(--)
基本含義:讓一個變量漲一個數字1,或者讓一個變量降一個數字1
使用格式:寫在變量名稱之前,或者寫在變量名稱之后。例如:++num,也可以num++
使用方式:
(1)單獨使用:不和其他任何操作混合,自己獨立成為一個步驟。
(2)混合使用:和其他操作混合,例如與賦值混合,或者與打印操作混合,等。
使用區別:
(1)在單獨使用的時候,前++和后++沒有任何區別。也就是:++num;和num++;是完全一樣的。
(2)在混合的時候,有【重大區別】
A. 如果是【前++】,那么變量【立刻馬上+1】,然后拿着結果進行使用。 【先加后用】
B. 如果是【后++】,那么首先使用變量本來的數值,【然后再讓變量+1】。 【先用后加】
注意事項:只有變量才能使用自增、自減運算符。常量不可發生改變,所以不能用。
Demo:
1 int num1 = 10; 2 System.out.println(num1); // 10
3 ++num1; // 單獨使用,前++
4 System.out.println(num1); // 11
5 num1++; // 單獨使用,后++
6 System.out.println(num1); // 12 7
8 // 與打印操作混合的時候
9 int num2 = 20; 10 // 混合使用,先++,變量立刻馬上變成21,然后打印結果21
11 System.out.println(++num2); // 21
12 System.out.println(num2); // 21
13
14 int num5 = 50; 15 // 混合使用,后--,首先把本來的數字50交給result2,然后自己再-1變成49
16 int result2 = num5--; 17 System.out.println(result2); // 50
18 System.out.println(num5); // 49 19
20 // 30++; // 錯誤寫法!常量不可以使用++或者--
二、賦值運算符
賦值運算符包括 | |
= | 等於號 |
+= | 加等於 |
-= | 減等於 |
*= | 乘等於 |
/= | 除等於 |
%= | 取模等 |
賦值運算符:
1、基本賦值運算符:就是一個等號“=”,代表將右側的數據交給左側的變量。
2、符合賦值運算符:復合賦值運算符:+=、-=、*=、/=、%=
注意事項:
1、只有變量才能使用賦值運算符,常量不能進行賦值。
2、復合賦值運算符其中隱含了一個強制類型轉換。
3、賦值運算符時,先計算右邊的表達式,最后再進行賦值運算。
Demo:
1 int a = 10; 2 // 按照公式進行翻譯:a = a + 5 3 // a = 10 + 5; 4 // a = 15; 5 // a本來是10,現在重新賦值得到15
6 a += 5; 7 System.out.println(a); // 15 8
9 // 50 = 30; // 常量不能進行賦值,不能寫在賦值運算符的左邊。錯誤寫法!
10
11 byte num = 30; 12 // num = num + 5; 13 // num = byte + int 14 // num = int + int 15 // num = int 16 // num = (byte) int
17 num += 5; 18 System.out.println(num); // 35
三、比較運算符
比較運算符包括 | |
== | 比較符號兩邊數據是否相等,相等結果是true |
< | 比較符號左邊的數據是否小於右邊的數據,如果小於結果是true。 |
> | 比較符號左邊的數據是否大於右邊的數據,如果大於結果是true。 |
<= | 比較符號左邊的數據是否小於或者等於右邊的數據,如果小於結果是true。 |
>= | 比較符號左邊的數據是否大於或者等於右邊的數據,如果小於結果是true。 |
!= | 不等於符號 ,如果符號兩邊的數據不相等,結果是true。 |
注意事項:
1、比較運算符的結果一定是一個boolean值,成立就是true,不成立就是false
2、如果進行多次判斷,不能連着寫。例如:1 < x < 3 程序當中【不允許】這種寫法,編譯會報錯。
四、邏輯運算符
邏輯運算符包括 | 運算規則 |
&& 短路與 | 1. 兩邊都是true,結果是true 2. 一邊是false,結果是false 短路特點:符號左邊是false,右邊不再運算 |
& 邏輯與 | 兩邊都是true,結果是true |
|| 短路或 | 1. 兩邊都是false,結果是false 2. 一邊是true,結果是true 短路特點: 符號左邊是true,右邊不再運算 |
| 邏輯或 | 1. 兩邊都是false,結果是false 2. 一邊是true,結果是true |
!邏輯非 | 1. ! true 結果是false 2. ! false結果是true |
^ 邏輯異或 | 類似於:求不同。 兩邊不一樣為 true;兩邊一樣為 false |
短路運算:
短路運算是只判斷第一個表達式的值而不再去判斷第二個表達式,從而節省計算機判斷的次數。
注意事項:
1. 邏輯運算符只能用於boolean值。
2. 與、或需要左右各自有一個boolean值,但是取反只要有唯一的一個boolean值即可。
3. 與、或兩種運算符,如果有多個條件,可以連續寫。
例:兩個條件:條件A && 條件B 多個條件:條件A && 條件B && 條件C
Demo:
1 int a = 10; 2 // false && ...
3 System.out.println(3 > 4 && ++a < 100); // false
4 System.out.println(a); // 10
5 System.out.println("============"); 6
7 int b = 20; 8 // true || ...
9 System.out.println(3 < 4 || ++b < 100); // true
10 System.out.println(b); // 20
五、三元運算符(條件運算符)
三元運算符格式:
數據類型 變量名= 布爾類型表達式?結果1:結果2
-
- 三元運算符計算規則:
- 布爾類型表達式結果是true,三元運算符整體結果為結果1,賦值給變量。
- 布爾類型表達式結果是false,三元運算符整體結果為結果2,賦值給變量。
- 三元運算符計算規則:
Demo:
int j = (3<=4 ? 500 : 600); // j= 500
擴展:
一元運算符:只需要一個操作數就可以進行操作的運算符。例如:取反!、自增++、自減--
二元運算符:需要兩個操作數才可以進行操作的運算符。例如:加法+、賦值=
三元運算符:需要三個操作數才可以進行操作的運算符。
六、位運算符
位運算符效率很高,但是可讀性不好。因為它是基於二進制的補碼直接運算的。
1、左移:<<
運算規則:<< 幾位,就乘以 2 的 幾次方;二進制補碼左移 n 位,右邊補 0
Demo:
System.out.println(4 << 3); //等價於4乘以2的3次方,4*8=32
4的二進制:0000 0100
4<<3: 0010 0000 (向左移動3位,左邊補0)
2、右移:>>
運算規則:>> 幾位,就除以 2 的幾次方;二進制補碼右移 n 位,左邊補0還是1,看最高位
Demo:
System.out.println(32 >>4); //等價於32除以2的4次方,32/16 =2
32的二進制:0010 0000
32>>4 : 0000 0010 (向右移動4位,右邊補位看最高位)
System.out.println(-32 >>4); //等價於-32除以2的4次方,-32/16 =-2
-32的二進制:
原碼:1010 0000
反碼:1101 1111
補碼:1110 0000
-32>>4: 1111 1110 (向右移動4位,右邊補最高位)
補碼:1111 1110
反碼:1111 1101
原碼:1000 0010 = -2
3、無符號右移:>>>
運算規則:二進制補碼右移n位,左邊補0;對於負數來說,移完后,變為正數
Demo:
System.out.println(32 >>> 4); //和>>一樣,左邊補0
32的二進制:0010 0000
32>>4: 0000 0010
System.out.println(-32 >>> 4);
-32的二進制:
原碼:1000 0000 0000 0000 0000 0000 0010 0000
反碼:1111 1111 1111 1111 1111 1111 1101 1111
補碼:1111 1111 1111 1111 1111 1111 1110 0000-32>>>4: 0000 1111 1111 1111 1111 1111 1111 1110
最高位是0,是正數
4、按位與:&
運算規則:
1 | 1 結果1
1 | 0 結果1
0 | 1 結果1
0 | 0 結果0
Demo:
System.out.println(32 & 25);
32:0000 0000 0000 0000 0000 0000 0010 0000
25:0000 0000 0000 0000 0000 0000 0001 1001
32 & 25:0000 0000 0000 0000 0000 0000 0000 0000
5、按位或:|
運算規則:
1 ^ 1 結果0
1 ^ 0 結果1
0 ^ 1 結果1
0 ^ 0 結果0
Demo:
System.out.println(32 | 25);
32:0000 0000 0000 0000 0000 0000 0010 0000
25:0000 0000 0000 0000 0000 0000 0001 1001
32 | 25:0000 0000 0000 0000 0000 0000 0011 1001
6、按位異或:^
運算規則:
1 ^ 1 結果0
1 ^ 0 結果1
0 ^ 1 結果1
0 ^ 0 結果0
Demo:
System.out.println(32 | 25);
32:0000 0000 0000 0000 0000 0000 0010 0000
25:0000 0000 0000 0000 0000 0000 0001 1001
32 | 25:0000 0000 0000 0000 0000 0000 0011 1001
7、按位取反:~(一元運算符)
運算規則:
~1 為 0
~0 為 1
Demo:
System.out.println(~3);
3: 0000 0000 0000 0000 0000 0000 0000 0011
~3: 1111 1111 1111 1111 1111 1111 1111 1100
補碼: 1111 1111 1111 1111 1111 1111 1111 1100
反碼: 1111 1111 1111 1111 1111 1111 1111 1011
原碼: 1000 0000 0000 0000 0000 0000 0000 0100 -4
七、運算符的優先級
運算符的優先級決定了表達式中運算執行的先后順序。通常優先級由高到低的順序是:
-
- 增量和減量運算
- 算數運算
- 位運算
- 比較運算
- 邏輯運算
- 賦值運算
- 增量和減量運算
Tips:如果兩個運算有相同的優先級,那么左邊的表達式要比右邊的表達式先被處理。
運算符的優先級:
優先級 | 描述 | 運算符 |
1 | 括號 | . () |
2 | 一元運算符 | ++、--、~、! |
3 | 乘、除、模 | *、/、% |
4 | 加減 | +、- |
5 | 移位運算 | >>、<<、>>> |
6 | 比較運算 | <、>、>=、<=、instanceof |
7 | 比較是否相等 | ==、!= |
8 | 按位與運算 | & |
9 | 按位異或運算 | ^ |
10 | 按位或運算 | | |
11 | 邏輯與運算 | && |
12 | 邏輯或運算 | || |
13 | 三元運算符 | ? : |
14 | 賦值運算符 | =、*=、/= 、%= |
15 | 復合賦值運算符 | +=、-=、<<=、>>= |
16 | 擴展賦值運算符 | >>>=、&=、^=、|= |