1. 运算符介绍
运算符是一种特殊的符号, 用以表示数据的运算, 赋值和比较等操作。
- 运算符分类
- 算术运算符
- 赋值运算符
- 关系运算符 ( 比较运算符 )
- 逻辑运算符
- 三元运算符
- 位运算符 ( 需要二进制基础 )
2. 算术运算符
Java 支持所有的基本算术运算符,
| 运算符 | 运算 | 示例 | 结果 |
|---|---|---|---|
| + | 正号 | +7 | 7 |
| + | 字符串连接符 | “hello” + “ world” | “hello world” |
| + | 加号 | 10 +10 | 20 |
| ++ | 自增[++在前], 先运算后取值 | a = 2; b = ++a | b=3, a=3 |
| ++ | 自增[++在后], 先取值后运算 | a = 2; b = a++ | b=2, a=3 |
| - | 负号 | b = 10; -b | -10 |
| - | 减号 | 10-1 | 9 |
| – | 自减[–在前], 先运算后取值 | a = 2; b = –a | b=1, a=1 |
| – | 自减[–在后], 先取值后运算 | a = 2; b = a– | b=2, a=1 |
| * | 乘 | 10 * 10 | 100 |
| / | 除 | 10 / 10 | 1 |
| % | 取模(取余数) | 5 % 3 | 2 |
2.1 加号运算符 ( + )
加号运算符有三种作用
- 表示正数,即在数轴线上,0的右侧的数
- 加法符号,表示两个数相加
- 连接符号,可以用于字符串的拼接
- 代码示例
1 | // 1. 加号 ( + ) |
2.2 减法符号 ( - )
减法符号有两个作用
- 表示负数,即在数轴线上,0的左侧的数
- 减法符号,表示两个数做减法运算
- 代码示例
1 | // 2. 减号 ( - ) |
2.3 乘法运算符 ( * )
- 表示乘法运算
1 | // 3. 乘号 ( * ) |
2.4 除法运算符 ( / )
如果除法运算符的两侧都是整数, 计算结果也是整数, 如 10/4 结果为 2, 会将小数点后面的数值截掉
如果除法运算符的两侧都是整数, 除数不能为 0 , 否则会引发除 0 异常
如果除数两侧有一个或两个浮点类型, 则均允许为 0, 根据 0 的位置结果为正无穷或负无穷
- 代码示例
1 | // 4. 除号 ( / ) |
2.5 取模运算符 ( % )
用第一个数除以第二个数, 取到的余数就是取模运算的结果
取模运算符的结果不一定都是整数
因为取模需要进行除法运算, 所以如果取模运算符的两侧都是整数, 则第二个数不能是 0 , 否则会引发除 0 异常
如果除数两侧有一个或两个浮点类型, 则第二个操作数允许为 0, 其结果为非数,NaN
- 代码示例
1 | // 5. 取模 ( % ) |
2.6 自加运算符(++)
自加运算符是单目运算符
自加运算符只能作用于单个数值类型(整型或浮点均可)的变量, 不能操作表达式或常量
自加运算符出现在操作符的 左侧, 先自加在做操作
自加运算符出现在操作符的 右侧, 先做操作再自加
- 代码示例
1 | // 1. 前 ++ , 先自增, 后赋值 |
2.7 自减运算符
自减运算符是单目运算符
自减运算符只能作用于单个数值类型(整型或浮点均可)的变量, 不能操作表达式或常量
自减运算符出现在操作符的左侧, 先自减在做操作
自减运算符出现在操作符的右侧, 先做操作再自减
- 代码示例
1 | // 3. 前 -- |
2.8 其他算术运算符
Java 没有提供其他更复杂的运算符,
如果想使用其他运算符如乘方, 开方等可以使用 java.lang.math 类的工具方法完成相关运算
1 | public class ArithmeticOperator5 { |
3. 赋值运算符
赋值运算符就是将某个运算后的值, 赋给指定的变量
- 赋值运算符的分类:
- 基本赋值运算符
=, 如: int a = 10; - 复合赋值运算符:
+=,-=,*=,/=,%=
1 | a += b |
- 赋值运算符的特点
运算顺序从右向左
int num = a + b + c赋值运算符的左边只能是变量, 右侧可以是变量, 表达式或常量值
右侧为常量值: int a = 10;
右侧为表达式: int b = 10+10;
右侧为变量值: int c = a;
复合赋值符号会进行类型转换
- byte =2; b+=3; // b 依然是 byte 类型
- 测试代码
1 | public class AssignOperator { |
4. 比较运算符
关系运算符的结果都是 boolean 类型, 也就是说结果 只能为
true或false关系表达式经常用在 if 结构或者循环结构中
比较运算符组成的表达式, 称为关系表达式. 如 a > b
比较运算符
==不能写成=
- 比较运算符表格
| 运算符 | 运算 | 说明 | 示例 | 结果 |
|---|---|---|---|---|
| == | 相等 | 如果要比较的两个数都是数值类型, 只要数值相等, 即便类型不同也会返回 true, 比如: ‘a’ == 97 返回 true, 1.0 == 1 也返回 true 如果比较的两个数都是引用类型, 那么只有在比较的两个引用变量存在父子关系时才能进行比较, 必须在两个引用指向同一个对象时才会返回 true 支持两个 Boolean 类型的比较, 如 false == true 返回 false |
1==2 | false |
| != | 不等 | 如果要比较的两个数都是数值类型, 只要数值不相等就返回 true 如果比较的两个数都是引用类型, 那么只有在比较的两个引用变量存在父子关系时才能进行比较, 必须在两个引用指向不是同一个对象会返回 true |
1!=2 | true |
| < | 小于 | 只支持左右两边操作数是数值类型,如果运算符左侧变量值小于右侧变量值时,返回 true | 1<2 | true |
| <= | 小于等于 | 只支持左右两边操作数是数值类型,如果运算符左侧变量值小于或等于右侧变量值时,返回 true | 1<=2 | true |
| > | 大于 | 只支持左右两边操作数是数值类型,如果运算符左侧变量值大于右侧变量值时,返回 true | 1>2 | false |
| >= | 大于等于 | 只支持左右两边操作数是数值类型,如果运算符左侧变量值大于或等于右侧变量值时,返回 true | 1>=2 | false |
| instanceof | 检查是否是类的对象 | 返回运算符左边的对象是否是它右边的类的实例 | “hello” instanceof String | True |
1 | public class RelationalOperator { |
5. 逻辑运算符
逻辑运算符用于连接多个条件
逻辑运算符的最终结果是一个 boolean 值
逻辑运算符说明表格
| 运算符 | 名称 | 使用规则 |
|---|---|---|
| & | 逻辑与 | a&b, 当 a,b 同时为 true, 结果为 true, 否则结果为 false |
| && | 短路与 | a&&b, 当 a,b 同时为 true, 结果为 true, 否则结果为 false |
| | | 逻辑或 | a|b, 当 a,b 有一个为 true 时,结果就为 true, 当 a,b 都为 false 时,结果才为 false |
| || | 短路或 | a||b, 当 a,b 有一个为 true 时,结果就为 true, 当 a,b 都为 false 时,结果才为 false |
| ! | 取反 | !a, 当 a 为 true, 结果为 false, 当 a 为 false 结果为 true |
| ^ | 异或 | a^b, 当 a 与 b 不同时(一个为 true, 另一个为 false), 结果为 true, 当 a,b 相同时, 结果为 false |
- 逻辑运算符示例表格
| 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 |
5.1 逻辑与,短路与
| 符号 | 名称 | 语法 | 规则 |
|---|---|---|---|
| & | 逻辑与 | 条件 1 & 条件 2 & … | 当所有条件同时为 true, 结果为 true, 否则结果为 false |
| && | 短路与 | 条件 1 && 条件 2 && … | 当所有条件同时为 true, 结果为 true, 否则结果为 false |
- 短路与 和 逻辑与 的 区别
- 逻辑与:无论当前条件能否决定最终的结果, 都会判断所有条件,
- 短路与:当遇到能够决定最终结果的条件时, 便不会判断后面的条件了
- 短路与的效率更高, 所以在开发中基本都会使用短路与
1 | public class LogicOperator1 { |
5.2 逻辑或,短路或
| 符号 | 名称 | 语法 | 规则 |
|---|---|---|---|
| | | 逻辑或 | 条件 1 | 条件 2 | … | 只要有一个有条件为 true, 结果为 true, 所有条件都为 false 结果才为 false |
| || | 短路或 | 条件 1 || 条件 2 || … | 只要有一个有条件为 true, 结果为 true, 所有条件都为 false 结果才为 false |
- 短路或 和逻辑或的区别
- 逻辑或:无论当前条件能够决定最终的结果, 都会判断所有条件,
- 短路或:当遇到能够决定最终结果的条件时, 便不会判断后面的条件了
- 短路或的效率更高, 所以在开发中基本都会使用短路或
1 | public class LogicOperator2 { |
5.3 取反,异或
| 符号 | 名称 | 语法 | 规则 |
|---|---|---|---|
| ! | 取反 | ! 条件 | 如果条件为 true, 结果为 false , 如果条件为 false 结果才为 true |
| ^ | 异或 | 条件 1 ^ 条件2 | 当条件 1 和条件 2 不同时结果为 true, 当条件 1 和条件 2 相同时结果 false |
1 | public class LogicOperator3 { |
6. 三元运算符
三元运算符的基本语法是:
- ( expression ) ? if-true-statement : If-false-statement
- ( 条件表达式) ? 表达式1 : 表达式2
运算规则:
如果条件表达式为 true, 结果为表达式 1
如果条件表达式为 false, 结果为表达式 2
表达式 1 和表达式 2 要为可以赋值给接收变量的类型,(包括类型自动转换)
三元运算符可以转换成 if- else 语句
1 | a > b ? d : e |
- 三元运算符测试代码
1 | public class TernaryOperator { |
7. 运算符的优先级
运算符有不同优先级, 所谓的优先级就是表达式运算中的运算顺序, 下面运算符表中的上一行总是优先于下一行,
只有单目运算符, 赋值运算符是从右向左运算的, 其他运算符均是从左向右
| 运算符 | 优先度 高→低 |
|---|---|
| 分隔符 | . () {} ; , |
| 单目运算 | ++ – ~ ! |
| 强制类型转换符 | ( type ) |
| 算术运算符(乘,除,取模) | * / % |
| 算术运算符(加,减) | + - |
| 位移运算符 | << >> >>> 位移 |
| 比较运算符 | < > <= >= instanceof |
| 比较运算符(等价运算) | == != |
| 按位与 | & |
| 按位异或 | ^ |
| 按位或 | | |
| 条件与 | && |
| 条件或 | || |
| 三目运算符 | ? : |
| 赋值运算符 | = *= /= %= |
| 赋值运算符 | += -= <<= >>= |
| 赋值运算符 | >>>= &= ^= |= |