Java 操作符知多少
收錄更新:https://github.com/cunyu1943/JavaPark
目錄
前言
算術(shù)運算符
關(guān)系運算符
位運算符
邏輯運算符
賦值運算符
條件運算符(? :)
instanceof
運算符優(yōu)先級
equals() 和 ==
總結(jié)
前言
之前的文章 中介紹了 Java 變量和數(shù)據(jù)類型,那么如何對他們進(jìn)行運算呢?這就要用到運算符的相關(guān)知識點了。所謂運算符,就是指 Java 中對變量或者字面量進(jìn)行操作的符號。下面就來具體看看,常用的操作符。
本文主要內(nèi)容預(yù)告如下:
算術(shù)運算符 關(guān)系運算符 位運算符 邏輯運算符 賦值運算符 條件運算符
好了,話不多說,開始正式內(nèi)容吧!
算術(shù)運算符
常見的算術(shù)運算符主要有下表中的幾種,主要是針對整型和浮點類型的運算。
| 操作符 | 描述 |
|---|---|
+ | 加法 - 相加運算符兩側(cè)的值 |
- | 減法 - 左操作數(shù)減去右操作數(shù) |
* | 乘法 - 相乘操作符兩側(cè)的值 |
/ | 除法 - 左操作數(shù)除以右操作數(shù) |
% | 取余 - 左操作數(shù)除以右操作數(shù)的余數(shù) |
++ | 自增: 操作數(shù)的值增加 1 |
-- | 自減: 操作數(shù)的值減少 1 |
注意:++ 和 -- 可以放在操作數(shù)之前,也可以放在操作數(shù)之后;位于操作數(shù)之前時,先自增/減,再賦值;位于操作數(shù)之后,先賦值,再自增/減;總結(jié)起來就是符號在前就先加/減,符號在后就后加/減。
以下是部分算術(shù)運算符的示例以及運行結(jié)果:
/**
* @author : cunyu1943
* @version : 1.0
* @className : Main
* @date : 2021/4/15 9:43
* @description : 算術(shù)運算符演示
*/
public class Main {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
int num3 = 30;
int num4 = 40;
System.out.println("num1 + num2 = " + (num1 + num2));
System.out.println("num1 - num2 = " + (num1 - num2));
System.out.println("num1 * num2 = " + (num1 * num2));
System.out.println("num2 / num1 = " + (num2 / num1));
System.out.println("num2 % num1 = " + (num2 % num1));
System.out.println("num3 % num1 = " + (num3 % num1));
System.out.println("num1++ = " + (num1++));
System.out.println("num1-- = " + (num1--));
// 查看 ++ 在操作數(shù)前后位置時結(jié)果的不同
System.out.println("num4++ = " + (num4++));
System.out.println("++num4 = " + (++num4));
}
}

這里不難看出,無論是 ++ 還是 --,當(dāng)它們單獨寫一行時,不管是放在變量前邊還是后邊,其最終結(jié)果都是一樣的。但如果將它們參與運算,此時的效果就不一樣了,這里需要注意。
int a = 10;
int b = a++;
以上代碼中,先進(jìn)行了 b = a 的賦值操作,所以此時 b 的值是 10。
int a = 10;
int b = ++a;
而此時,先要對 a 進(jìn)行加一的操作之后,再將 a 的值賦予 b,所以此時 b 的值為 11。
關(guān)系運算符
關(guān)系運算符主要是指兩個數(shù)據(jù)間的關(guān)系,兩者之間的比較結(jié)果用邏輯值來表示,常用來比較判斷兩個變量或常量的大小。常見的關(guān)系運算符及含義如下表:
| 運算符 | 描述 |
|---|---|
== | 檢查如果兩個操作數(shù)的值是否相等,如果相等則條件為真 |
!= | 檢查如果兩個操作數(shù)的值是否相等,如果值不相等則條件為真 |
> | 檢查左操作數(shù)的值是否大于右操作數(shù)的值,如果是那么條件為真 |
< | 檢查左操作數(shù)的值是否小于右操作數(shù)的值,如果是那么條件為真 |
>= | 檢查左操作數(shù)的值是否大于或等于右操作數(shù)的值,如果是那么條件為真 |
<= | 檢查左操作數(shù)的值是否小于或等于右操作數(shù)的值,如果是那么條件為真 |
以下是部分關(guān)系運算符的示例以及運行結(jié)果:
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/15 9:45
* @description : 關(guān)系運算符
*/
public class Main {
public static void main(String[] args) {
int num1 = 100;
int num2 = 220;
System.out.println("num1 == num2 = " + (num1 == num2));
System.out.println("num1 != num2 = " + (num1 != num2));
System.out.println("num1 > num2 = " + (num1 > num2));
System.out.println("num2 < num1 = " + (num2 < num1));
System.out.println("num2 <= num1 = " + (num2 <= num1));
System.out.println("num2 >= num1 = " + (num2 >= num1));
}
}

位運算符
位運算符主要用來對操作數(shù)二進(jìn)制的位進(jìn)行運算,其運算結(jié)果是整型的。常見的位運算符及功能描述如下表所示:
| 操作符 | 描述 |
|---|---|
& | 如果相對應(yīng)位都是 1,則結(jié)果為 1,否則為 0 |
| | 如果相對應(yīng)位都是 0,則結(jié)果為 0,否則為 1 |
^ | 如果相對應(yīng)位值相同,則結(jié)果為 0,否則為 1 |
? | 按位取反運算符翻轉(zhuǎn)操作數(shù)的每一位,即 0 變成 1,1 變成 0 |
<< | 按位左移運算符。左操作數(shù)按位左移右操作數(shù)指定的位數(shù) |
>> | 按位右移運算符。左操作數(shù)按位右移右操作數(shù)指定的位數(shù) |
>>> | 按位右移補零操作符。左操作數(shù)的值按右操作數(shù)指定的位數(shù)右移,移動得到的空位以零填充 |
以下是部分位運算符的示例以及運行結(jié)果:
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/15 10:02
* @description : 位運算符
*/
public class Main {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
System.out.println("num1 & num2 = " + (num1 & num2));
System.out.println("num1 | num2 = " + (num1 | num2));
System.out.println("num1 ^ num2 = " + (num1 ^ num2));
System.out.println("~ num2 = " + (~num2));
System.out.println("num1 << 2 = " + (num1 << 2));
System.out.println("num1 >> 2 = " + (num1 >> 2));
System.out.println("num1 >>> 2 = " + (num1 >>> 2));
}
}

邏輯運算符
邏輯運算符通過將關(guān)系表達(dá)式連接起來,從而組成一個復(fù)雜的邏輯表達(dá)式,從而判斷程序中的表達(dá)式是否成立,其結(jié)果返回 true 或 false。
| 操作符 | 描述 |
|---|---|
&& | 稱為邏輯與運算符。當(dāng)且僅當(dāng)兩個操作數(shù)都為真,條件才為真 |
|| | 稱為邏輯或操作符。如果任何兩個操作數(shù)任何一個為真,條件為真 |
! | 稱為邏輯非運算符。用來反轉(zhuǎn)操作數(shù)的邏輯狀態(tài)。如果條件為 true,則邏輯非運算符將得到 false |
以下是邏輯運算符的示例以及運行結(jié)果:
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/15 10:07
* @description : 邏輯運算符
*/
public class Main {
public static void main(String[] args) {
boolean positive = true;
boolean negative = false;
System.out.println("positive && negative = " + (positive && negative));
System.out.println("positive || negative = " + (positive || negative));
System.out.println("!(positive || negative) = " + !(positive || negative));
}
}

賦值運算符
賦值運算符表示一個動作,將其右側(cè)的值送到左側(cè)的變量中。常見的賦值運算符及含義如下表所示:
| 操作符 | 描述 |
|---|---|
= | 簡單的賦值運算符,將右操作數(shù)的值賦給左側(cè)操作數(shù) |
+= | 加和賦值操作符,它把左操作數(shù)和右操作數(shù)相加賦值給左操作數(shù) |
-= | 減和賦值操作符,它把左操作數(shù)和右操作數(shù)相減賦值給左操作數(shù) |
*= | 乘和賦值操作符,它把左操作數(shù)和右操作數(shù)相乘賦值給左操作數(shù) |
/= | 除和賦值操作符,它把左操作數(shù)和右操作數(shù)相除賦值給左操作數(shù) |
%= | 取模和賦值操作符,它把左操作數(shù)和右操作數(shù)取模后賦值給左操作數(shù) |
<< = | 左移位賦值運算符 |
>>= | 右移位賦值運算符 |
&= | 按位與賦值運算符 |
^= | 按位異或賦值操作符 |
|= | 按位或賦值操作符 |
以下是部分賦值運算符的示例以及運行結(jié)果:
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/15 10:13
* @description : 賦值運算符
*/
public class Main {
public static void main(String[] args) {
int num1 = 100;
int num2 = 1000;
System.out.println("num1 + num2 = " + (num1 + num2));
System.out.println("num1 += num2 = " + (num1 += num2));
System.out.println("num1 - num2 = " + (num1 - num2));
System.out.println("num1 -= num2 = " + (num1 -= num2));
System.out.println("num1 * num2 = " + (num1 * num2));
System.out.println("num1 *= num2 = " + (num1 *= num2));
System.out.println("num1 & num2 = " + (num1 & num2));
System.out.println("num1 &= num2 = " + (num1 &= num2));
}
}

條件運算符(? :)
也叫作三元運算符,共有 3 個操作數(shù),且需要判斷布爾表達(dá)式的值,常用來取代某個 if-else 語句。其語法結(jié)構(gòu)如下所示:
關(guān)系表達(dá)式?表達(dá)式 1:表達(dá)式 2;
variable x = (expression) ? value if true : value if false
以下是條件運算符的示例以及運行結(jié)果:
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/15 10:18
* @description : 條件運算符
*/
public class Main {
public static void main(String[] args) {
int num1 = 30;
int num2 = 300;
int result = num1 > num2 ? num1 : num2;
System.out.println("The max between num1 and num2 is " + result);
}
}

instanceof
用于操作對象實例,檢查該對象是否是一個特定類型(類類型或接口類型),其語法結(jié)構(gòu)如下。該知識點涉及到類與對象,此處就不做展開,等到后邊學(xué)習(xí)類與對象之后,就能理解了。
( Object reference variable ) instanceof (class/interface type)
運算符優(yōu)先級
運算符有很多,如果我們將多個運算符組合在一起,那它們又該先計算哪一個,然后再計算哪一個呢?其實就像我們?nèi)粘E抨犚粯樱\算符也是有優(yōu)先級的。常用運算符的優(yōu)先級如下表所示,在我們使用時,如果涉及到一個表達(dá)式中含有多個運算符,一定要注意運算符的優(yōu)先級。當(dāng)然了,讓我們背下來這些也是挺難的。不過不要緊,我們只需要學(xué)會靈活運用 () 就好了。我們可以利用 () 將需要先計算的表達(dá)式括起來,然后再去進(jìn)行下一步的運算。
| 優(yōu)先級 | 運算符 |
|---|---|
| 1 | .、()、{} |
| 2 | !、~、++、-- |
| 3 | *、/、% |
| 4 | +、- |
| 5 | <<、>>、>>> |
| 6 | <、<=、>、>=、instanceof |
| 7 | ==、!= |
| 8 | & |
| 9 | ^ |
| 10 | | |
| 11 | && |
| 12 | || |
| 13 | ?: |
| 14 | =、+=、-=、*=、/=、%=、&= |
equals() 和 ==
==
基本數(shù)據(jù)類型用 == 比較的是值,而 用于引用數(shù)據(jù)類型時判斷兩個對象的內(nèi)存地址是否相等,即兩對象是否是同一個對象;
本質(zhì)來講,由于 Java 中只有值傳遞,所以不管是基本數(shù)據(jù)類型還是引用數(shù)據(jù)類型,比較的其實都是值,只不過引用類型變量存的值是對象的地址;
equals()
作用也是判斷兩個對象是否相等,但是 不能用于基本數(shù)據(jù)類型變量的比較。存在于 Object() 類中,所以所有類都具有 equals() 方法存在兩種使用情況:
類未覆蓋 equals()方法:此時通過equals()比較該類的兩個對象時,等價于==比較這兩個對象,默認(rèn)使用Object類中的equals()方法;類覆蓋了 equals()方法:一旦覆蓋了該方法,則用來比較兩個對象的內(nèi)容是否相等,如我們常用的String、BitSet、Data、File就覆蓋了equals()方法;
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/15 13:26
* @description : == 和 equals 用法
*/
public class Main {
public static void main(String[] args) {
int num1 = 10;
int num2 = 10;
int num3 = 20;
String str1 = "村雨遙";
String str2 = new String("村雨遙");
// == 用于基本數(shù)據(jù)類型,用于比較兩者是否相等
System.out.println("num1 == num2:" + (num1 == num2)); // true
System.out.println("num3 == num3:" + (num2 == num3)); // false
// 而用于引用類型則表示兩者是否指向同一對象
System.out.println("str1 == str2:" + (str1 == str2)); // false
// equals 用于比較引用類型是否內(nèi)容是否相同
System.out.println("str1 equals str2:" + str1.equals(str2)); // true
// equals 不能用于基本數(shù)據(jù)類型比較
// System.out.println(num1.equals(num2));
}
}

總結(jié)
好了,以上就是有關(guān)操作符系列的相關(guān)知識點了。老規(guī)矩,如果您覺得對您有所幫助,那就點個贊吧 ??.
對于文中所遺漏或者存在錯誤的知識點,也歡迎大家評論指正呀!
- END -