作为一门计算机语言, Java 提供了一套丰富的运算符来操纵变量。
Java 中运算符可分为以下:算术运算符 (+ - * /)、关系运算符 (< > ==) 、逻辑运算符、位运算符、
移位运算符以及条件运算符等。
算术运算符
下面是算术运算符的使用
int a = 30;
int b = 10;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);
System.out.println(a%b);
加减乘除和数学里面的没有区别,取模运算相当于数学中除法的余数
下面我们看一下字符串
String str = "ObiWan";
System.out.println(str);
字符串相加是什么效果?
我们可以看到他是拼接在一起了
如果字符串加数字会怎么样?
我们没有得到ObiWan30,而是得到了ObiWan1020
这是为什么?
因为:其他数据类型和字符串使用+拼接,结果就是一个字符串
那我们要是想要得到ObiWan30,怎么做呢?
两个解决办法,第一个办法是把数字加法放到前面,第二个办法是加括号
我们想要10+20在前面还是输出1020ObiWan,怎么做呢?
我们想要输出a=10,b=20,又怎么做呢?
第一个,我们可以给10+20的中间加上“”,中间加不加空格都可以,这样相当于数字加字符串加数字加字符串,而不是数字加数字加字符串
第二个也是同样的方法,把其中一个数字变成字符串,就可以了
我们再看一下java的转义字符
下面这些代码的输出是什么
String s1 = "\"bit\"";
String s2 = "\\bit\\";
String s3 = "\\\\bit\\\\"
答案是
\\ | 代表一个反斜字符\ |
\" | 代表一个双引号字符 |
那么数字可不可以转换成字符串呢?
可以看到它输出了一个10
我们借用一个String.valueof()
这个方法里面可以看到八大类型都在里面
就变成了字符串
我们还可以字符串变整数
是用 Integer.valueOf
做几个简单的数学题
System.out.println(10%3);
System.out.println(-10%3);
System.out.println(10%-3);
System.out.println(-10%-3);
答案是多少呢?
因为java里面的,取余,求模,取模全是求余数
自增/自减运算符 ++ --
下面这段代码结果是什么
int a = 10;
int b = a++;
int c = 10;
int d = ++c;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
- 如果单独使用,【前置++】和【后置++】没有任何区别
- 如果混合使用,【前置++】先+1,然后使用变量+1之后的值,【后置++】先使用变量原来的值,表达式 结束时给变量+1
- 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改
关系运算符
关系运算符主要有六个 : == != < > <= >= ,其计算结果是 true 或者 false 。
使用关系运算符,其结果就有一个是布尔值
if(布尔表达式)
[表达式1 && 表达式2] -> 这两个表达式都是布尔表达式
问,下面这段代码,什么结果,那些输出true , 那些输出false
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
逻辑运算符
逻辑运算符主要有三个 : && || ! ,运算结果都是 boolean 类型。
语法规则:表达式 1 && 表达式 2 ,左右表达式必须是 boolean 类型的结果。
int a = 1;
int b = 2;
System.out.println(a==1 && b==2);
System.out.println(a==1 && b > 100);
System.out.println(a>100 && b==2);
System.out.println(a>100 && b>100);
上面代码结果是什么?
两个表达式都为真,结果才是真,只要有一个是假,结果就是假。
逻辑 ||
语法规则:表达式 1 || 表达式 2 ,左右表达式必须是 boolean 类型的结果。
下面这段代码又是什么结果
int a = 1;
int b = 2;
System.out.println(a==1 || b==2);
System.out.println(a==1 || b > 100);
System.out.println(a>100 || b==2);
System.out.println(a>100 || b>100);
左右表达式至少有一个位真,则结果为真
逻辑非 !
语法规则: ! 表达式 ,真变假,假变真。
下面这段代码结果又是什么
int a = 1;
System.out.println(!(a==1));
System.out.println(!(a!=1));
短路求值
&& 和 || 遵守短路求值的规则
代码结果是什么
System.out.println(10 > 20 && 10 / 0 == 0);
System.out.println(10 < 20 || 10 / 0 == 0);
我们都知道 , 计算 10 / 0 会导致程序抛出异常 . 但是上面的代码却能正常运行 , 说明 10 / 0 并没有真正被求值 .
注意 :
- 对于 && , 如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式.
- 对于 ||, 如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式.
- & 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值.
下面这段代码结果是什么?
System.out.println(10 > 20 & 10 / 0 == 0);
System.out.println(10 > 20 | 10 / 0 == 0);
位运算符
移位运算
移位运算符有三个 : << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。
1. 左移 << : 最左侧位不要了, 最右侧补 0.
注意: 向左移位时,丢弃的是符号位,因此正数左移可能会编程负数

2. 右移 >> : 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)

无符号右移 >>>: 最右侧位不要了, 最左侧补 0.
1111 1111 >>> 1 -> 0111 1111
注意 :
1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
2. 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
4. 移动负数位或者移位位数过大都没有意义.
条件运算符:三目运算符
表达式1?表达式2:表达式3
表达式为布尔表达式
运算符的优先级
注意:运算符之间是有优先级的. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可.