2.6、运算符
运算符就是用来对数值、变量进行计算的符号。
2.6.1、算数运算符
算术运算符
+ 加法运算符(字符串的拼接,数学加号)、正号
- 减法运算符、负号
* 乘法运算符
/ 除法运算符(参与运算的数都是整数时为整数除法,否则为浮点除法)(整数被0除会出现异常,而浮点数则会得到无穷大或者NaN)
% 求余
++ 自增: 操作数的值增加1
int a = ++1:先自增,再参与运算 int a = 1; int b = a++; int c = ++a; a=3 b=1 c = 3
int a = 1++:先参与运算,再自增
-- 自减: 操作数的值减少1
--1:先自减,再参与运算
1--:先参与运算,再自减
2.6.2、赋值运算符
赋值运算符可以将一个直接量的值赋给变量,也可以将变量的值赋给另一个变量,还能将表达式的值赋给变量,且它支持连续赋值(但不推荐这么做)。
赋值表达式的运算顺序是先计算右边的值,再将值赋给左边的变量。
赋值运算符
= 将右操作数的值赋给左侧操作数
+=、-=、*=、/= 把左操作数和右操作数的值相加、减、乘、除、后赋值给左操作数
%=:取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数
<<=:左移位赋值运算符 C <<= 2等价于C = C <<2
>>=:右移位赋值运算符 C >>= 2等价于C = C >>2
&=:按位与赋值运算符 C&= 2等价于C = C&2
^=:按位异或赋值操作符
|=:按位或赋值操作符
2.6.3、关系运算符
使用关系运算符得出的结果都是布尔型,要么是true,要么是false
关系运算符
== 判断如果两个操作数的值是否相等,如果相等则条件为真。
! = 判断如果两个操作数的值是否相等,如果值不相等则条件为真。
> 判断左操作数的值是否大于右操作数的值,如果是那么条件为真。
>= 判断左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。
< 判断左操作数的值是否小于右操作数的值,如果是那么条件为真。
<= 判断左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。
instanceof :检查该对象是否是一个特定类型(类类型或接口类型)。
String name = "Java"
name instanceof String 结果:true(name是String类型的)
2.6.4、逻辑运算符
逻辑运算符用于连接布尔表达式。
逻辑运算符
&&:与、且 一假则假,全真才为真
||:或 一真则真
!:非 取反
2.6.5、位运算符
位运算符
&(与):如果相对应位都是1,则结果为1,否则为0
a: 0 0 1 1 1 1 0 0
b: 1 1 1 1 1 1 1 1
a&b: 0 0 1 1 1 1 0 0
|(或):如果相对应位都是 0,则结果为 0,否则为 1
a: 0 0 1 1 1 1 0 0
b: 1 1 1 1 1 1 1 1
a|b: 1 1 1 1 1 1 1 1
〜(非):按位取反运算符翻转操作数的每一位,即0变成1,1变成0。
a: 0 0 1 1 1 1 0 0
~a: 1 1 0 0 0 0 1 1
^(异或):如果相对应位值相同,则结果为0,否则为1
a: 0 0 1 1 1 1 0 0
b: 1 1 1 1 1 1 1 1
a^b: 1 1 0 0 0 0 1 1
<<:按位左移运算符。将位向左移动指定的位数。左边超出的位被丢弃,右边空出的位用0填充。。3<<3相当于3乘以2^3
5: 0 0 0 0 0 1 0 1
5<<2: 0 0 0 1 0 1 0 0 = 5*2^2 = 20
>>:按位右移运算符:将位向右移动指定的位数,右边超出的位丢弃。左边空出的位用原来的符号位填充。15>>3为15除以2^3
15: 0 0 0 0 1 1 1 1
15>>3: 0 0 0 0 0 0 0 1 = 15/(2^3) = 1 (整数除法中,结果取整数部分,为1)
(位移运算符直接操作位,效率很快,在hash等扩容上都是使用的位移(1<<16),所以每次扩容都是2倍)。
>>>:按位右移补零操作符。将位向右移动指定的位数,无论正负,左边空出的位都用0填充。
&和&&的区别:(|和|| 一个道理)
&&是逻辑运算符,与、且的意思。两边表达式一假则假,全真才为真。具有短路功能,如左边运算式为false,则右边的表达式不参与运算
&是位运算符,按位与,等式两边表达式都为false时可做逻辑与运算,但等式两边都参与计算,无短路功能。
2*8怎么运算最快?
按位左移运算符操作最快,把2左移3位 2<<3
**因为2转换成2进制数为:0000 0010 **
左移三位为:0001 0000 转换成10进制为16
<< >> 的效率是极高的
8>>32:在 Java 中,对于整数类型的右移操作 >>,如果移动的位数等于或超过该类型的大小(对于 int 类型是32位,对于 long 类型是64位),则实际移动的位数会是移动位数对该类型大小取模的结果。因此,对于 int 类型的数值
8 >> 32
,实际上等同于8 >> (32 % 32)
,即8 >> 0
。
public boolean isOdd(int i) 判断奇数偶数
public boolean isOdd(int i){ return i%2 ! = 0 } public boolean isOdd(int i){ return (i&1) == 1; }
2.6.6、三目运算符
三目运算符是可以转化成 if、else结构的,但是这种简单的判断优先选择三目运算符,效率更高。
条件运算符(三目运算符)※※※※※※
(条件)?a:b 如果条件为true则执行a,否则执行b(a和b的数据类型要一致)