运算符介绍

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等

运算符分类

java运算符大致可以分为以下六种

  1. 算数运算符
  2. 赋值运算符
  3. 逻辑运算符
  4. 位运算符
  5. 三元运算符

算数运算符

总体概括

  1. 加号+
  2. 减号-
  3. 乘号*
  4. 除号/
  5. 取模(取余)%
  6. 自增++
  7. 自减--

减号-、乘号*使用上基本和现实生活中差不多,不做赘述

加号细节

当加号+两边有一边是字符串时,作用为对字符串进行拼接

1
2
3
4
5
 int a = 10;
String b = "hello";
String c = a + b;
System.out.println("hello" + 10); // hello10
System.out.println(c); // hello10

除号细节

  1. 整型变量之间相除,只保留整数位
1
int a = 5 / 2 //结果为2
  1. 浮点数和整型变量相除,总会保留小数位
1
2
double a = 5.0 / 2 //结果为2.5
double a = 4.0 / 2 //结果为2.0

取模(取余)细节

取模的本质:a%b=a-a/b*b

1
2
3
4
10 % 3 =  1
-10 % 3 = -1
10 % -3 = 1
-10 % -3 = -1

自增/自减细节

前置自增/自减

先自增/自减1再取值

1
2
3
int a = 10
int b = ++a; // a先自增1,再赋值给b
// 结果:a=11,b=11
1
2
3
int a = 10;
int b = --a; // a先自减1,再赋值给b
// 结果:a=9,b=9
后置自增/自减

先取值再自增/自减1

1
2
3
int a = 10;
int b = a++; // a先赋值给b,再自增1
// 结果:a=11,b=10
1
2
3
int a = 10;
int b = a--; // a先赋值给b,再自减1
// 结果:a=9,b=10
细节
1
2
3
4
5
6
7
8
int i = 1; 
i=++i;
// 结果:i=2
// 规则:
// 使用临时变量
// temp = i;
// i = i + 1;
// i = temp;

关系运算符

总体概括

  1. 相等==
  2. 不等于!=
  3. 小于<
  4. 大于>
  5. 小于等于<=
  6. 大于等于>=
  7. 检查是否是类或其子类的对象instanceof

细节

  1. 关系运算符的结果都是boolean型
  2. 关系运算符经常用在if结构或者循环结构的条件中

逻辑运算符

介绍

用于连接多个条件(多个关系表达式),最总的结果也是一个boolean型

总体概括

  1. 逻辑与&
  2. 短路与&&
  3. 逻辑或|
  4. 短路或||
  5. !
  6. 异或^

真值表

逻辑运算符的作用基本上可以通过真值表来表明

a b a & b a && b a | b a || b !a a ^ b
true true true true true true false false
true false false false true true false true
false true false false true true true true
false false false false false false true false

细节

短路与和逻辑与的区别

短路与&&会做逻辑优化,逻辑与&则不会

与运算逻辑优化

1
2
// a && b
// 当a = 0时,无论如何表达式a && b都为false,逻辑优化,不会执行b语句

所以短路与&&效率高,开发中也比较常用

短路或和逻辑或的区别

短路或||会做逻辑优化,逻辑或|则不会

因此短路或||效率高,开发中也比较常用

或运算逻辑优化

1
2
// a || b
// 当a = 1时,无论如何表达式a || b都为true,逻辑优化,不会执行b语句

异或

1
2
3
// a ^ b
// 当a,b都为true或false时,a^b为false
// 当a,b不都为true或false时,a^b为true

赋值运算符

介绍

赋值运算符就是将某个运算后的值,赋给指定的变量

分类

  1. 基本赋值运算符=
  2. 复合赋值运算符+=-=*=/=%=

基本赋值运算符

=右边表达式的值赋给左边

复合赋值运算符

对左边表达式进行某种运算

+=为例,其他类推

1
2
// a += b
// 等价于 a = a + b

细节

  1. 赋值运算符的运算顺序从右向左,先计算右边表达式的值,再进行赋值
  2. 赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值
  3. 复合赋值运算符运算时遵循自动类型转换规则

三元运算符

基本语法

1
条件表达式 ? 表达式1 : 表达式2

运算规则

1
2
3
4
5
6
// 等价于以下if-else语句
if (条件表达式) {
表达式1;
} else {
表达式2;
}

当条件表达式为true时,运算后的结果是表达式1的值

当条件表达式为false时,运算后的结果是表达式2的值

细节

表达式1和表达式2要为可以赋给接收变量的类型(或可以自动转换)

位运算符

位运算是在补码的基础上进行运算的,但是结果还是要看原码

java没有无符号数,java中的数都是有符号的

~:按位取反

按位1变0,0变1

&:按位与

两位全为1,结果为1,否则为0

|:按位或

两位有一个为1,结果为1,否则为0

^:按位异或

两位一个为0,一个为1,结果为1,否则为0

<<:左移运算符

低位溢出,符号位不变,并用符号位补溢出的高位

左移不区分有符号和无符号,都是左移之后右边补上0,最左边的符号位也直接移走

向左边移动一位,相当于乘以2

>>:右移运算符

符号位不变,低位补0,也称有符号右移

有符号右移就是右移之后,左边的补上符号位,正数补0,负数补1

向右边移动一位,相当于除以2

>>>:逻辑右移

逻辑右移也叫无符号右移,低位溢出,高位补0

无符号右移就是右移之后,无论该数为正还是为负,右移之后左边都是补上0

注:没有<<<符号

有符号右移>>和无符号右移>>>比较

1
2
3
System.out.println(Integer.toBinaryString(-10));	  // 11111111111111111111111111110110
System.out.println(Integer.toBinaryString(-10 >> 2));//11111111111111111111111111111101高位正数补0,负数补1
System.out.println(Integer.toBinaryString(-10 >>> 2));// 00111111111111111111111111111101 高位补0

运算符优先级

编号 运算顺序 运算符
1 / . () {} ; ,
2 从右到左 ++ – ~ !(强制类型转化)
3 从左到右 *** / %**
4 从左到右 + -
5 从左到右 << >> >>>
6 从左到右 < > <= >= instanceof
7 从左到右 == !=
8 从左到右 &
9 从左到右 ^
10 从左到右 |
11 从左到右 &&
12 从左到右 ||
13 从左到右 ? : (三元运算符)
14 从右到左 *= = /= %=
15 从右到左 += -= <<= >>=
16 从右到左 >>>= &= ^= |=