Java Grammar(二):運算子
阿新 • • 發佈:2020-03-16
### 運算子簡介
計算機自打誕生以來,用作最多的就是進行**計算**,而計算離不開運算子,所以運算子在我們的Java語言中的地位舉足輕重,我們現在就來了解一下Java給我們提供的運算子。
從運算的元素的個數來區分,可以分為一元運算子,二元運算子,三元運算子。
其中一元運算子包括:
- +(正數)
- -(負數)
- ++(自增1)
- —(自減1)
- ~(按位取反)
- !(邏輯取反)
> 其實自增和自減也可以看成是特殊的二元運算子
二元運算子包括:
- 算術運算子:`+ ,-,*,/,%`
- 邏輯運算子:`&&,||`
- 關係運算符:`==,!=,>,<,>=,<=`
- 位運算子:`&,|,^,<<,>>,>>>`
- 賦值運算子:`=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=`
- instanceof運算子:`instanceof`
三元運算子就只有一種:` ?:`
![7CF6586D-17A7-43B7-BC31-A29EBDD1B23A](http://ww2.sinaimg.cn/large/006tNc79gy1g5vscu7kf5j30tq0kcgnd.jpg)
這些運算相信絕大部分已經被在座的各位所熟知,只有極個別的不是很清楚的,下面我所瞭解的一些面試熱點知識來進行講解。
### 一些運算子的小常識
#### 自增,自減的前後位置
老生常談的一個問題,但是還是容易被搞混,自增和自減的順序前後到底有何不同:
- **單獨使用**的時候,兩種**沒有**任何區別(溫馨提示:**面試的時候切記不要忘記第一點喲**)
- 在**表示式**中使用的時候,字首會**先進行**+1(-1)的運算,而後綴會先運算**後進行**+1(-1);
在無視掉第一種情況的下,可以簡單記為**字首前,字尾後**。
#### 邏輯運算子的短路特性
我們在使用邏輯運算子`&&,||`的時候,可以利用邏輯運算子的短路特性減少運算次數,所謂短路特性就是**當第一個條件可以判斷最終結果的時候,就不會去判斷第二個條件**
```java
A && B (當A為false,直接跳過第二個條件的判斷,判定為false)
A || B (當A為true,直接跳過第二個條件的判斷,判定為true)
```
#### 三元運算子
該運算子的主要是決定哪個值應該賦值給變數。
```java
int a , b;
a = 10;
// 如果 a 等於 1 成立,則設定 b 為 20,否則為 30
b = (a == 1) ? 20 : 30;
System.out.println( "Value of b is : " + b );
// 如果 a 等於 10 成立,則設定 b 為 20,否則為 30
b = (a == 10) ? 20 : 30;
System.out.println( "Value of b is : " + b );
```
#### instanceof
該運算子用於操作物件例項,檢查該物件是否是一個特定型別(類型別或介面型別)。
```java
Vehicle a = new Car();
boolean result = a instanceof Car;
System.out.println( result);
```
### 位運算子
位運算子可能在我們日常中使用的並不是很多,算是一個小盲區。但是其實這個運算子還是非常的重要的,我們首先來了解一下運算的機制,與其他運算子不同的是,位運算子是要講數值轉換成二進位制後,再進行運算。
`&`
![95D04C0D-1F8E-483D-9737-7FA44129BE31](http://ww1.sinaimg.cn/large/006tNc79gy1g5vsebfv8uj30o00d8wht.jpg)
`|`
![AD20CC8F-CAFD-4C48-94BD-ABED28D279AE](http://ww1.sinaimg.cn/large/006tNc79gy1g5vsej2kc3j30qi0cqdj9.jpg)
`^`是按位異或運算子,只有兩個對應的運算位不一致的時候,對應計算出的位置為1,否則為0。
`~`是按位取反運算子,將每一位取反(1 -> 0,0 ->1)
![57BB3EC6-07B2-4B57-B9CC-2A3FFA4DFD33](http://ww4.sinaimg.cn/large/006tNc79gy1g5vsf7vdshj310u0b0tbz.jpg)
這裡需要注意`>>`和`>>>`存在一定的區別:
`>>` :該數對應的二進位制碼整體右移,左邊的用**原有標誌位**補充,右邊超出的部分捨棄。
`>>>` :不管正負標誌位為0還是1,將該數的二進位制碼整體右移,左邊部分總是以0填充,右邊部分捨棄。
其餘操作部分與`<<`類似,就不再畫圖演示
#### 位運算子的運用場景
- 計算 $m * 2^n$ 次方
```java
2 << 3 = 16;
2 * (2 * 2 * 2) = 16;
```
- 判斷一個數n的奇偶性
```java
a & 1 = 0; // 偶數
a & 1 = 1; // 奇數
```
- 不用臨時變數交換兩個數
```java
a = a^b;
b = b^a;
a = a^b;
```
- x 的 相反數 表示為 (~x+1)
```java
-x = (~x+1)
```
- 取絕對值 (a^(a> >31))-(a>>31)
其餘的一些在演算法中用到的場景,我這裡就不再多少,有興趣的同學可以去研究一下~
### 運算子優先順序
最高優先順序的在該表上方,最低優先順序的在該表底部
| 類別 | 操作符 | 關聯性 |
| :------- | :---------------- | :------- |
| 字尾 | ()[].(點操作符) | 左到右 |
| 一元 | ++ - !~ | 右到左 |
| 乘性 | * / % | 左到右 |
| 加性 | + - | 左到右 |
| 移位 | \> \> \>\>\> << | 左到右 |
| 關係 | \> \>= = < <= | 左到右 |
| 相等 | == ~= | 左到右 |
| 按位與 | & | 左到右 |
| 按位異或 | ^ | 左到右 |
| 按位或 | \| | 左到右 |
| 邏輯與 | && | 左到右 |
| 邏輯或 | \|\| | 左到右 |
| 條件 | ?: | 從右到左 |
| 賦值 | =,+=,-=,等等 | 從右到左 |
| 逗號 | , | 左到右 |
### 公眾號
動動小手點點關注,就是對創作者最大的支援和贊同
![](http://viyoungblog.oss-cn-beijing.aliyuncs.com/viyoung/2020-03-15-qrcode_for_gh_a65beceb0947_