Java運算符優先級:
序列號 |
符號 |
名稱 |
結合性(與操作數) |
目數 |
說明 |
1 |
. |
點 |
從左到右 |
雙目 |
|
( ) |
圓括號 |
從左到右 |
|||
[ ] |
方括號 |
從左到右 |
|||
2 |
+ |
正號 |
從右到左 |
單目 |
|
- |
負號 |
從右到左 |
單目 |
||
++ |
自增 |
從右到左 |
單目 |
前綴增,後綴增 |
|
- - |
自減 |
從右到左 |
前綴減,後綴減 |
||
~ |
按位非/取補運算 |
從右到左 |
單目 |
||
! |
邏輯非 |
從右到左 |
單目 |
||
3 |
* |
乘 |
從左到右 |
雙目 |
|
/ |
除 |
從左到右 |
雙目 |
整數除法:取商的整數部分,小數部分去掉,不四捨五入 |
|
% |
取餘 |
從左到右 |
雙目 |
||
4 |
+ |
加 |
從左到右 |
雙目 |
|
- |
減 |
從左到右 |
雙目 |
||
5 |
<< |
左移位運算符 |
從左到右 |
雙目 |
|
>> |
帶符號右移位運算符 |
從左到右 |
雙目 |
||
>>> |
無符號右移 |
從左到右 |
雙目 |
||
6 |
< |
小於 |
從左到右 |
雙目 |
|
<= |
小於或等於 |
從左到右 |
雙目 |
||
> |
大於 |
從左到右 |
雙目 |
||
>= |
大於或等於 |
從左到右 |
雙目 |
||
instanceof |
確定某對象是否屬於指定的類 |
從左到右 |
雙目 |
||
7 |
== |
等於 |
從左到右 |
雙目 |
|
!= |
不等於 |
從左到右 |
雙目 |
||
8 |
& |
按位與 |
從左到右 |
雙目 |
|
9 |
| |
按位或 |
從左到右 |
雙目 |
|
10 |
^ |
按位異或 |
從左到右 |
雙目 |
|
11 |
&& |
短路與 |
從左到右 |
雙目 |
|
12 |
|| |
短路或 |
從左到右 |
雙目 |
|
13 |
? : |
條件運算符 |
從右到左 |
三目 |
|
14 |
= |
賦值運算符 |
從右到左 |
雙目 |
|
+= |
混合賦值運算符 |
||||
-= |
|||||
*= |
|||||
/= |
|||||
%= |
|||||
&= |
|||||
|= |
|||||
^= |
|||||
<<= |
|||||
>>= |
|||||
>>>= |
說明:
1、 該表中優先級按照從高到低的順序書寫,也就是優先級爲1的優先級最高,優先級14的優先級最低。
2、 結合性是指運算符結合的順序,通常都是從左到右。從右向左的運算符最典型的就是負號,例如3+-4,則意義爲3加-4,符號首先和運算符右側的內容結合。
3、 instanceof作用是判斷對象是否爲某個類或接口類型;
4、 注意區分正負號和加減號,以及按位與和邏輯與的區別其實在實際的開發中,不需要去記憶運算符的優先級別,也不要刻意的使用運算符的優先級別,對於不清楚優先級的地方使用小括號去進行替代,示例代碼:
int m = 12;
int n = m << 1 + 2;
int n = m << (1 + 2); //這樣更直觀
這樣書寫代碼,更方便編寫代碼,也便於代碼的閱讀和維護。
1.算數運算符:
加法:+ 減法:- 乘法:* 除法:/ 求餘:%
2.關係(比較)運算符:
比較運算符運算的結果是一個boolean類型的值,如果比較結果成立則爲true,否則爲false
< :只能比較基本類型數據之間的關係,不能比較對象之間的關係。
> : (同關係運算符“<”)
<=: (同關係運算符“<”)
>=: (同關係運算符“<”)
== :若使用該運算符比較兩個對象的引用(變量),則實質上是比較兩個變量是否引用了相同的對象。所謂相同的對象是指,是否是在堆棧(Heap)中開闢的同一塊兒內存單元中存放的對象。
若比較兩個對象的引用(變量)所引用的對象的內容是否相同,則應該使用equals()方法,該方法的返回值類型是布爾值。需要注意的是:若用類庫中的類創建對象,則對象的引用調用equals()方法比較的是對象的內容;若用自定義的類來創建對象,則對象的引用調用equals()方法比較的是兩個引用是否引用了同一個對象,因爲第二種情況equals()方法默認的是比較引用。
!= :(同關係運算符“==”)
比較運算符的運算規則和現實中的規則一樣。需要注意的問題主要有以下幾個:
boolean類型只能比較相等和不相等,不能比較大小;
int a = 10;
boolean b = (a > 3); //該條件成立,則將值true賦值給變量b
boolean c = (b == true); //條件成立,結果爲true在實際代碼中,數值、變量以及運算結果都可以直接參與比較,只是程序中爲了增強可讀性,有些時候需要將比較分開進行書寫
3.邏輯運算符:
&&(and) ||(or) !(not)
邏輯運算符的運算結果是boolean類型,參與邏輯運算的數據也必須是boolean類型;
符號
|
名稱
|
功能說明
|
&&
|
邏輯與
|
兩個條件同時爲true才爲true,否則爲false
|
||
|
邏輯或
|
兩個條件有一個爲true則爲true,否則爲false
|
!
|
邏輯非
|
只操作一個數據,對數據取反
|
boolean b1 = true;
boolean b2 = false;
boolean b3 = b1 && b2; //則b3的值是false
b3 = b1 || b; //則b3的值是true
b3 = !b1; //則b3的值是false
最後說一下&&和&的區別,其實在進行邏輯與運算時,既可以使用&&也可以使用&,在功能上本身沒有區別。兩者區別的位置在,對於&來說,如果左側條件爲false,也會計算右側條件的值,而對於&&來說,如果左側的條件爲false,則不計算右側的條件,這種現象被稱作短路現象;
int n = -1;
boolean b1 = (n >= 0) && (n < 10);
boolean b2 = (n >= 0) & (n < 10);
則對於第二行代碼來說,兩個條件都將被計算,而對於第三行代碼來說,因爲n >= 0這個條件不成立,則n < 10根本不會被執行。當然,兩者得到的最終結果是一樣的。
int n = 10;
boolean b = (n < 8) && ((n = 1) != 0);
int m = 10;
boolean b1 = (m < 8) & ((m = 1) != 0);
System.out.println(n);
System.out.println(m);
結果爲:
10
1
4.位運算符
通過二進制計算,計算的結果爲原碼;
& | ^ ~
int x, y = 5, z = 3;
x = y | z;
System.out.println(x); //打印爲:7
x = y & z;
System.out.println(x); //打印爲:1
x = y ^ z;
System.out.println(x); //打印爲:6
x = ~ y;
System.out.println(x); //打印爲:-6
按二進制的補碼計算:正數補碼原碼反碼相同;
y | 0 | 1 | 0 | 1 |
z | 0 | 0 | 1 | 1 |
y&z | 0 | 1 | 1 | 1 |
對於x = ~y;由於計算的是補碼:y的補碼是0101,~y 是符號位和數值都取反,變爲了1010,即~y的補碼是1010,反碼是1001,原碼是1110,符號位去掉,即是-6;
可以記爲 y 取相反數-1;
5.移位運算符
移位運算符就是在二進制的基礎上對數字進行平移。按照平移的方向和填充數字的規則分爲三種:<<(左移)、>>(帶符號右移)和>>>(無符號右移);
在移位運算時,byte、short和char類型,在進行移位之前,都將被轉換成int類型;移位後的結果也會變成int類型,對於byte、short、char和int進行移位時,規定實際移動的次數是移動次數和32的餘數,也就是移位33次和移位1次得到的結果相同;或者說移位符號右邊的操作數只截取其二進制的後5位(目的是防止因爲移位操作而超出int類型的表示範圍:2的5次方是32,int類型的最大範圍是32位)。移動long型的數值時,規定實際移動的次數是移動次數和64的餘數,也就是移動66次和移動2次得到的結果相同,即對long類型進行移位,結果仍然是long類型,移位符號右邊的操作符只截取其二進制的後6位。
<< :按二進制形式把所有的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零;左移的規則只記住一點:丟棄最高位,0補最低位
需要移位的數字 << 移位的次數
例如: 3 << 2,則是將數字3左移2位
計算過程:
3 << 2
首先把3轉換爲二進制數字0000 0000 0000 0000 0000 0000 0000 0011,然後把該數字高位(左側)的兩個零移出,其他的數字都朝左平移2位,最後在低位(右側)的兩個空位補零。則得到的最終結果是0000 0000 0000 0000 0000 0000 0000 1100,則轉換爲十進制是12.數學意義:
在數字沒有溢出的前提下,對於正數和負數,左移一位都相當於乘以2的1次方,左移n位就相當於乘以2的n次方。
>>運算規則:按二進制形式把所有的數字向右移動對應巍峨位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1;或者說:若符號位爲正,則在最高位插入0;若符號位爲負,則在最高位插入1;右移的規則只記住一點:符號位不變,左邊補上符號位
語法格式:
需要移位的數字 >> 移位的次數
例如11 >> 2,則是將數字11右移2位
計算過程:11的二進制形式爲:0000 0000 0000 0000 0000 0000 0000 1011,然後把低位的最後兩個數字移出,因爲該數字是正數,所以在高位補零。則得到的最終結果是0000 0000 0000 0000 0000 0000 0000 0010.轉換爲十進制是2;
數學意義:右移一位相當於除2,右移n位相當於除以2的n次方。
>>>運算規則:按二進制形式把所有的數字向右移動對應的位數,低位移出(捨棄),高位的空位補零。對於正數來說和帶符號右移相同,對於負數來說不同。
或者說:無論正負,都在最高位插入0;
無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位
無符號右移運算符>>> 只是對32位和64位的值有意義
int n = 4;
System.out.println(n << 2); //16
System.out.println(n >> 2); //1
System.out.println(n >>> 2); //1