目录
- 2.5 运算符
- 2.5.1、算数运算符
- 2.5.2、赋值运算符
- 2.5.3、关系运算符
- 2.5.4、逻辑运算符
- 2.5.5、位运算符
- 2.5.6、三目运算符
- 2.5.7、优先级
2.5 运算符
2.5.1、算数运算符
算术运算符
+ 加法运算符(字符串相加,数学加号)、正号
- 减法运算符、 取反
* 乘法运算符
/ 除法运算符(结果会因为数据类型原因产生错误,比如用整数会忽略小数部分)
% 求余
++ 自增: 操作数的值增加1
++1:先自增,再参与运算 int a = 1; int b = a++; int c = ++a; a=3 b=1 c = 3
1++:先参与运算,再自增
-- 自减: 操作数的值减少1
--1:先自减,再参与运算
1--:先参与运算,再自减
2.5.2、赋值运算符
赋值运算符
= 将右操作数的值赋给左侧操作数
+=、-=、*=、/= 把左操作数和右操作数的值相加、减、乘、除、后赋值给左操作数
%=:取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数
<<=:左移位赋值运算符 C <<= 2等价于C = C <<2
>>=:右移位赋值运算符 C >>= 2等价于C = C >>2
&=:按位与赋值运算符 C&= 2等价于C = C&2
^=:按位异或赋值操作符
|=:按位或赋值操作符
2.5.3、关系运算符
使用关系运算符得出的结果都是布尔型,要么是true,要么是false
关系运算符
== 判断如果两个操作数的值是否相等,如果相等则条件为真。
!= 判断如果两个操作数的值是否相等,如果值不相等则条件为真。
> 判断左操作数的值是否大于右操作数的值,如果是那么条件为真。
>= 判断左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。
< 判断左操作数的值是否小于右操作数的值,如果是那么条件为真。
<= 判断左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。
instanceof :检查该对象是否是一个特定类型(类类型或接口类型)。
String name = "Java"
name instanceof String 结果:true(name是String类型的)
2.5.4、逻辑运算符
逻辑运算符用于连接布尔表达式。
逻辑运算符
&&:与、且 一假则假,全真才为真
||:或 一真则真
!:非 取反
2.5.5、位运算符
位运算符
&:如果相对应位都是1,则结果为1,否则为0(去)
a: 0011 1100
b: 1111 1111
a&b: 0011 1100
|:如果相对应位都是 0,则结果为 0,否则为 1
a: 0011 1100
b: 1111 1111
a|b: 1111 1111
^:如果相对应位值相同,则结果为0,否则为1
a: 0011 1100
b: 1111 1111
a^b: 1100 0011
〜:按位取反运算符翻转操作数的每一位,即0变成1,1变成0。
a: 0011 1100
~a: 1100 0011
<<:按位左移运算符。左操作数按位左移右操作数指定的位数。3<<3相当于3乘以2^3
>>:按位右移运算符。左操作数按位右移右操作数指定的位数。15>>3相当于15除以2^3
位移运算符直接操作位,效率很快,在hash等扩容上都是使用的位移(1<<16),所以每次扩容都是2倍。
>>>:按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。
&和&&的区别:
&&是逻辑运算符,与、且的意思。两边表达式一假则假,全真才为真。具有短路功能,如左边运算式为false,则 右边的表达式不参与运算
&是位运算符,按位与,等式两边表达式都为false时可做逻辑与运算,但等式两边都参与计算,无短路功能。
问:2*8怎么运算最快?
**答:按位左移运算符操作最快,把2左移3位 2<<3 **
**因为2转换成2进制数为:0000 0010 **
左移三位为:0001 0000 转换成10进制为16
<< >> 的效率是极高的
public boolean isOdd(int i) 判断奇数偶数的补全
public boolean isOdd(int i){ return i%2 != 0 } public boolean isOdd(int i){ return (i&1) == 1; }
2.5.6、三目运算符
三目运算符是可以转化成 if、else结构的,但是这种简单的判断优先选择三目运算符,效率更高。
条件运算符(三目运算符)※※※※※※
(条件)?a:b 如果条件为true则执行a,否则执行b(a和b的数据类型要一致)
2.5.7、优先级