算数运算符 + - * / % -- ++
赋值运算符 =
关系运算符 >, <, >=, <=, ==, !=, instanceof
逻辑运算符&&, ||, !
位运算符&, |, ^, ~, <<, >>, >>>
条件运算符 ? :
偷懒赋值运算符 +=, -=, *=, /=
public class Demo01 { public static void main(String[] args) { int a = 10; long b = 23213L; short c = 23; byte d = 122; System.out.println(a+b+c+d);//long类型 System.out.println(a+c+d);//int类型 System.out.println(c+d);//int类型 } }
在这里有long类型结果为long
如果没有long,结果都是int类型
public static void main(String[] args) { int x = 3; int y = x++; //先执行y = x 然后再执行x = x + 1 int z = ++x; //先执行x = x + 1 然后再执行z = x System.out.println(x); System.out.println(y); System.out.println(z); } //分别输出 5 3 5
可以看见自增/减运算符的位置会影响执行的顺序
public class Demo02 { public static void main(String[] args) { //关系运算符 int a = 10; int b = 20; System.out.println(a>b); System.out.println(a<b); } } //系统分别输出 false、true
通过关系运算返回的是一个布尔值
就是我们很常说的 与或非
短路运算
public class Demo03 { public static void main(String[] args) { int c = 5; boolean flag = (c < 4)&&(c++ > 4); System.out.println(flag); System.out.println(c); } } //系统输出 false 5
很明显 判断完c < 4为假直接结束了与运算,给flag赋了false
后续系统输出的5说明c并没有自增,也证明了c++ > 4没有被执行,这就是所谓的短路运算
/** * A = 0011 1100 * B = 0000 1101 * |||| |||| * |||| |||| * A&B 0000 1100 * A|B 0011 1101 * A^B 0011 0001 * ~B 1111 0010 */
这里的位运算就和计算机组成原理位运算一样 参考着理解就行
拓展:2*8怎么做最为快速?
/* * 2*8=16 2*2*2=16 * * << *2 * >> /2 * 效率极高! * * 0000 0001 1 * 0000 0010 2 * 0000 0011 3 * 0000 0100 4 * 0000 1000 8 * 0001 0000 16 */ System.out.println(2 << 3);
不难发现1每左移一位 就是在乘2,因此2*8直接看成2左移3位,
对于计算机来说,位运算是最具有效率的运算方式,因此就是2<<3位最快速的方法
一句话看懂 网恋 ? 双流机场-8000 : 无事发生
字符串拼接
int a = 10; int b = 20; System.out.println("" + a + b); System.out.println(a + b + ""); //输出 1020 30字符串在前面,后面的加号就是拼接 字符串在后面,那前面的加号就是加运算了
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ()、[]、{} | 从左向右 |
2 | !、+、-、~、++、-- | 从右向左 |
3 | *、/、% | 从左向右 |
4 | +、- | 从左向右 |
5 | <<、>>、>>> | 从左向右 |
6 | <、<=、>、>=、instanceof | 从左向右 |
7 | ==、!= | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= | 从右向左 |