Java 中的运算符
Java 中的运算符可以这样分为六类:
- 算数运算符:
+
、-
、*
、/
、%
、++
、--
- 关系运算符:
==
、!=
、<
、<=
、>
、>=
- 逻辑运算符:
&&
、||
、!
、^
、&
、|
- 位运算符:
&
、|
、~
、^
、<<
、>>
、>>>
- 赋值运算符:
=
、+=
、-=
、*=
、/=
、%=
、&=
、|=
、^=
、<<=
、>>=
、>>>=
- 其他运算符:
.
、[]
、()
、?:
、instanceof
算数运算符
一元运算符
一元运算符只有一个操作数,其操作符为:正 +
、负 -
、自加 ++
、自减 --
这四个,其中自增 ++
和自减 --
又分两种情况:
- 用于数值变量之前:在赋值操作中,先对被
++
或--
操作变量值先加 1 或者先减 1,然后在进行其他的操作。 - 用于数值变量之后:在赋值操作中,先用被
++
或--
的操作变量值进行其他的操作,然后在对其值加 1 或者减 1。
示例代码:
1 | int a = 10; |
一元运算符和前后的操作数之间有空格,可能在有些编译器下编译时会出错。
二元运算符
二元运算符则需要两个操作数(即符号两边都需要有操作数),其操作符为:加 +
、减 -
、乘 *
、除 /
和 取余(取模) %
这五个,+
、-
、*
、/
完成加减乘除基本的四则运算,%
是求两个数相除后的余数,运算规则和数学运算基本相同,在算数运算中,计算时按照从左向右的顺序计算,乘除和求余优先于加减,有括号先计算括号里面的,可以参考运算符优先级。不同的是,程序中的乘运算符不可省略,在数学中可写为 y=2x
而程序中必须写为 y=2*x
。当二元运算的两个操作数的数据类型不同时,运算结果的数据类型和参与运算的操作数的数据类型中精度较高(或位数较长)一致。
示例代码:
1 | int a = 10; |
关系运算符
关系运算符用于比较两个数值之间的大小,其运算结果为一个逻辑类型(boolean 布尔类型)的数值,其操作符为:等于 ==
、不等于 !=
、小于 <
、小于等于 <=
、大于 >
和 大于等于 >=
这六个。
示例代码:
1 | int a = 10; |
逻辑运算符
逻辑运算符要求操作数的数据类型为逻辑类型(boolean 布尔类型),其运算结果也是逻辑类型(boolean 布尔类型)的值,其操作符为:与 &&
、或 ||
、非 !
、异或 ^
、与 &
、和 或 |
这六个。
示例代码:
1 | boolean a = true; |
A | B | A && B | A || B | !A | A ^ B | A & B | A | B |
---|---|---|---|---|---|---|---|
true | true | true | true | false | false | true | true |
true | false | false | true | false | true | false | true |
false | true | false | true | true | true | false | true |
false | false | false | false | true | false | false | false |
- &、&&:A 与 B 均为 true 则结果为 true,否则结果为 false。
- |、||:A 与 B 其中一个为 true 则结果为 true,否则结果为 false。
- !:A true 则结果为 false,否则结果为 true。
- ^:A 与 B 均为 true 或 false 即 A 与 B 结果相同时结果为 false,否则结果为 true。
其中 &&
与 &
看起来有同样的效果都表示与
,||
与 |
看起来也有同样的效果都表示或
,他们的运算规则也基本相同,&
和 |
运算是把逻辑表达式全部计算完,而 &&
和 ||
运算具有短路计算功能。在程序设计时使用 &&
和 ||
,不建议使用 &
和 |
。
对于
&
来说,如果左侧条件为 false,也会计算右侧条件的值,而对于&&
来说,如果左侧的条件为 false,则不计算右侧的条件,这种现象被称作短路现象。
位运算符
位运算实际是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低端位(最右边)到高位对齐,每位进行位运算,其操作数和运算结果都是整型值(byte、short、int、long),可以是有符号的也可以是无符号的,其中位运算符又可以分为位逻辑运算符和位移运算符,其运算符为:位与 &
、位或 |
、位异或 ^
、位非 ~
、左移 <<
、右移 >>
和 无符号右移(0填充的右移) >>>
这七个。
运算符 | 名称 | 示例 | 说明 |
---|---|---|---|
& |
位与 | 60 & 13 = 12 |
把 60 和 13 按位求与 |
| |
位或 | 60 | 13 = 61 |
把 60 和 13 按位求或 |
^ |
位异或 | 60 ^ 13 = 49 |
把 60 和 13 按位求异或 |
~ |
位非 | ~60 = -61 |
把 60 按位求非 |
<< |
左移 | 60 << 2 = 240 |
把 60 的各位左移 2 位 |
>> |
右移 | 60 >> 2 = 15 |
把 60 的各位右移 2 位 |
>>> |
无符号右移 | 60 >>> 2 = 15 |
把 60 的各位右移 2 位,左边填 0 |
位逻辑运算符
位运算中的逻辑运算符:位与 &
、位或 |
、位异或 ^
和 位非 ~
与逻辑运算的相应操作的真值表完全相同,其差别只是位运算操作的操作数和运算结果都是二进制整数,而逻辑运算相应操作的操作数和运算结果都是逻辑类型(boolean 布尔类型)的值。
A | B | A & B | A | B | A ^ B | ~A |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 0 |
示例代码:
1 | /* |
位移运算符
位移运算符:左移 <<
、右移 >>
和 无符号右移 >>>
。
示例代码:
1 | /* |
赋值运算符
赋值运算符是由二元算术运算符、逻辑运算符和位运算符加上一个等号 =
组合成的简捷运算符,可以简化一些常用表达式的书写。
Java 常见数据类型:
- 类型①(整型):
byte
、short
、int
、long
- 类型②(非整形):
double
、float
- 类型③(非数值类型):
char
、boolean
- 类型④(引用型数据类型):
String
赋值运算符与其他运算符的简介使用方式:
运算符 | 用法 | 等同于 | 类型 |
---|---|---|---|
+= |
a += b |
a = a + b |
① || ② || ④ |
-= |
a -= b |
a = a - b |
① || ② |
*= |
a *= b |
a = a * b |
① || ② |
/= |
a /= b |
a = a / b |
① || ② |
%= |
a %= b |
a = a % b |
① || ② |
&= |
a &= b |
a = a & b |
① || boolean |
|= |
a |= b |
a = a | b |
① || boolean |
^= |
a ^= b |
a = a ^ b |
① || boolean |
<<= |
a <<= b |
a = a << b |
① |
>>= |
a >>= b |
a = a >> b |
① |
>>>= |
a >>>= b |
a = a >>> b |
① |
其他运算符
点运算符
点运算符 .
的功能有两个:一是引用类中成员,二是指示包的层次等级,示例代码:
1 | int r = (int)(java.lang.Math.random() * 100); |
括号运算符
扩号运算符分为两种:
- 方括号
[]
是数组运算符,方括号[]
中的数值是数组的下标,整个表达式就代表数组中该下标所在位置的元素值。 - 圆括号
()
运算符用于改变表达式中运算符的优先级。
示例代码:
1 | String[] name = {"z", "p", "p", "0", "1", "9", "6"}; |
括号运算符成对出现,缺一不可。
条件运算符
条件运算符也被称为三目运算符。该运算符至少有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
示例代码:
1 | int a; |
上面提到说该运算符至少有3个操作数,也就是说可以有更多的操作数。以上面代码为例,其中的 b
为第一个操作数,x
为第二个操作数,z
为第三个操作数,如果我们将 操作数1 ? 操作数2 : 操作数3
视为一个整体,将其称为第四个操作数,照猫画虎,可以把第二个操作数换成第四个操作数,这时这个整体一共就有五个操作数,而原先的单个 if-else
就可以变成一个嵌套 if-(if-else)-else
。
示例代码:
1 | int a; |
如果把第三个操作数换成第四个操作数,这时这个整体一共就有五个操作数,而原先的单个 if-else
就可以变成一个 if-else if-else
。
示例代码:
1 | int a; |
同理可以一直嵌套写下去,这样写虽然方便,可以节省一些代码量,但是可读性差,不建议多个嵌套使用,如果使用尽量写清楚注释。
对象运算符
对象运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型),其操作符为:instanceof
。
1 | String name = "zpp0196"; |
如果运算符左侧变量所指的对象,是操作符右侧类或接口 (class/interface) 的一个对象,那么结果为真,很明显 name 是 String 的一个对象,所以返回 true。
如果被比较的对象兼容于右侧类型,该运算符仍然返回 true:
1 | CharSequence c = new String(); |
运算符优先级
优先级 | 操作符 | 关联性 |
---|---|---|
1 | . 、() 、[] |
从左到右 |
2 | + 、- 、! 、~ 、++ 、-- |
从右到左 |
3 | * 、/ 、% |
从左到右 |
4 | + 、- |
从左到右 |
5 | << 、>> 、>>> |
从左到右 |
6 | < 、<= 、> 、>= 、instanceof |
从左到右 |
7 | == 、!= |
从左到右 |
8 | & |
从左到右 |
9 | ^ |
从左到右 |
10 | | |
从左到右 |
11 | && |
从左到右 |
12 | || |
从左到右 |
13 | ?: |
从右到左 |
14 | = 、+= 、-= 、*= 、/= 、%= 、&= 、|= 、^= 、~= 、<<= 、>>= 、>>>= |
从右到左 |
15 | , |
从左到右 |