运算符优先级
序列号 | 符号 | 名称 | 结合性(与操作数) | 目数 | 说明 |
1 | . | 点 | 从左到右 | 双目 |
|
( ) | 圆括号 | 从左到右 |
|
| |
[ ] | 方括号 | 从左到右 |
|
| |
2 | + | 正号 | 从右到左 | 单目 |
|
- | 负号 | 从右到左 | 单目 |
| |
++ | 自增 | 从右到左 | 单目 | 前缀增,后缀增 | |
- - | 自减 | 从右到左 | 前缀减,后缀减 | ||
~ | 按位非/取补运算 | 从右到左 | 单目 |
| |
! | 逻辑非 | 从右到左 | 单目 | ||
3 | * | 乘 | 从左到右 | 双目 |
|
/ | 除 | 从左到右 | 双目 | 整数除法:取商的整数部分,小数部分去掉,不四舍五入 | |
% | 取余 | 从左到右 | 双目 |
| |
4 | + | 加 | 从左到右 | 双目 |
|
- | 减 | 从左到右 | 双目 |
| |
5 | << | 左移位运算符 | 从左到右 | 双目 |
|
>> | 带符号右移位运算符 | 从左到右 | 双目 |
| |
>>> | 无符号右移 | 从左到右 | 双目 |
| |
6 | < | 小于 | 从左到右 | 双目 | |
<= | 小于或等于 | 从左到右 | 双目 |
| |
> | 大于 | 从左到右 | 双目 |
| |
>= | 大于或等于 | 从左到右 | 双目 |
| |
instanceof | 确定某对象是否属于指定的类 | 从左到右 | 双目 |
| |
7 | == | 等于 | 从左到右 | 双目 | |
!= | 不等于 | 从左到右 | 双目 |
| |
8 | & | 按位与 | 从左到右 | 双目 |
|
9 | | | 按位或 | 从左到右 | 双目 |
|
10 | ^ | 按位异或 | 从左到右 | 双目 |
|
11 | && | 短路与 | 从左到右 | 双目 |
|
12 | || | 短路或 | 从左到右 | 双目 |
|
13 | ? : | 条件运算符 | 从右到左 | 三目 |
|
14 | = | 赋值运算符 | 从右到左 | 双目 |
|
+= | 混合赋值运算符 |
| |||
-= |
| ||||
*= |
| ||||
/= |
| ||||
%= |
| ||||
&= |
| ||||
|= |
| ||||
^= |
| ||||
<<= |
| ||||
>>= |
| ||||
>>>= |
|
自增自减运算
1、优先级进次于初等运算符 () [] .
2、++a或–a:本来就是先进行自加运算,所以很好理解
a++或a–: 由于自加自减运算符的优先级比较高(仅次于初等运算符)
,因而要先进行自加运算java,再进行赋值
运算,但此种写法又规定要让a自加之前的值参与运算,所以会先将a自加之前的值暂存一下
,在a自加后,再利用暂存的值进行其他低优先级的运算
3、注意,只有变量可以自加自减,常量由于值不能变,不能自加自减
位运算符
位运算符的操作数只能是整形或者字符型
& |
要判断左右两边的真假性,再 & | 操作,得到结果
此外,这两个运算符还能做位运算,即两边不仅可以是boolean型,还可以是数值
^
多个数的异或运算,可以任意调换数的顺序,结果不变
一个数异或同一个数两次,结果还是这个数
一个数异或全零,结果还是这个数
一个数异或全一,结果为取反(即反码操作)
~
反码操作,即各位取反,
正数取反再加一,即得到其对应负数的补码(也即负数值),因而取反操作得到的是其对应负数值再-1
<<
左移位,右边补零,相当于原数×2n,n为左移位的位数
>>
右移位,左边补原最高位的值(正数补零,负数补1)
使用位运算进行2的次幂的乘除,比直接进行2的次幂的乘除要高效
>>>
无符号右移,数据进行右移时,高位出现的空位,无论原高位是什么,空位用0补。
**注意:**在对char、bte、short进行移位运算时,编译器会自动将其转换为int,然后再进行移位操作。由于int型只占32bit,因此,为保证移动位数有效性,a>>n等价于a>>(n%32),>>>同理。
逻辑运算符
&&
只要前面 false ,后面就不再判断,和 & 得到的结果一样
||
只要前面 true ,后面就不再判断,和 | 得到的结果一样
instanceof
双目运算符,运算的结果是true和false
- 使用格式:对象引用 instanceof 类/接口,判断对象引用指向的 对象 是否为后面类/接口或其子类的实例,若是则结果为true,否则为false
左边操作元显式声明的类型与右边操作元必须是同种类或有继承关系, 即位于继承树的同一个分支上,否则会编译出错 - 作用:增强向下转型时代码健壮性
常见问题
==和equals区别
-
== 的作用:
基本类型:比较的就是值是否相同
引用类型:比较的就是地址值是否相同 -
equals 的作用:
//equals源码 public boolean equals(Object obj) { //this - s1 //obj - s2 return (this == obj); }
基本类型:不可比较
引用类型:默认情况下,比较的是地址值。
不过,我们可以根据情况自己重写
该方法。一般重写都是自动生成,比较对象的成员变量值是否相同 -
String类的equals()方法
String类中被复写的equals()方法其实是比较两个字符串的内容
:
1、首先比较引用,如果引用相同,返回true;
2、比较类型,如果不是比较的不是String对象,返回false;
3、比较长度,字符串长度不等时,返回false;
4、逐个字符比较两个字符串,遇到不一样的字符,返回false;
5、到最后都一致,返回ture;public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
i=i+1 i+=i i++ 区别
执行效率的高低(对一般编程语言而言)。
- 最低 i = i + 1
(1). 读取右i的地址
(2). i+1
(3). 读取左i的地址
(4). 将右i+1赋值给左i,编译器认为左右两个i是不一致的。 - 其次 i += 1
(1). 读取左i的地址
(2). i+1
(3). 将i+1赋值给i自身,编译器会认为只有同一个i - 最高 i++
(1). 读取i的地址
(2). 自增1
i+=i-=i*=i 的理解
int i = 12;
System.out.println(i+=i-=i*=i); //结果是-120
开始时,i的值是12,i*=i,i=i*i,此时i的值是144,然后i-=144,i=i-144,i的值是12(因为-的优先级比赋值高,所以i一直没有被赋值),12-144=-132,然后i+=-132,i的值是12-132=-120,结果是-120;
参考文献
[1] http://www.cnblogs.com/gw811/archive/2012/10/13/2722752.html
[2] http://www.cnblogs.com/nextnj/archive/2013/05/30/3107984.html
https://www.cnblogs.com/smyhvae/p/3929585.html java中 == 和equals区别
https://blog.youkuaiyun.com/barryhappy/article/details/6082823 String中 == 和equals区别
https://cloud.tencent.com/developer/article/1087835 自变运算符