4、Java运算符
Java是一门逻辑语言,在进行算术运算的时候,CPU可以直接识别,常见的运算符包括以下几种:
# 算术运算符
Java中不仅支持加减乘除,也支持自增、自减。
运算符 | 运算规则 | 范例 | 结果 |
---|---|---|---|
+ | 加 | 1+1 | 2 |
+ | 连接字符串 | “中”+“国” | “中国” |
- | 负号 | int a=-3; | -3 |
- | 减 | 3-1 | 2 |
* | 乘 | 2*3 | 6 |
/ | 除 | 5/2 | 2 |
% | 取模(余数) | 5/2 | 1 |
++ | 自增 | int a=1;a++或者++a | 2 |
-- | 自减 | int b=3;a--或者--a | 2 |
eg:
int x = 5;
int y = 2;
System.out.println(x + y); //7
System.out.println(x - y); //3
System.out.println(x * y); //10
System.out.println(x / y); //2
System.out.println(x % y); //1
x / y
在数学中本应该得到 2.5 ,但是 在int
整型中,不能表示浮点,所以结果取整数部分,舍余数。
如果需要精确到小数,可以使用float
或者double
类型。
eg:
double x = 5d;
double y = 2d;
System.out.println(x / y); //2.5
在8种基本数据类型中,以下6种数据都可以进行直接的算术运算:
- 4个 整数型:byte、short、int、long
- 2个浮点型:float、double
char 类型也可以运算,因为它也是10进制的Unicode值,但是不推荐这样做
# ++、--的使用
++
、--
表示自增、自减
int x = 1;
x++;
System.out.println(x); //2
x--
同理。
注意点:表达式 x++
和 ++x
是不一样的,这两种方法都可以表示自增,但是赋值和运算顺序不一样。
eg1:
int x = 1;
int y = x++;
System.out.println(x); // 2
System.out.println(y); // 1
eg2:
int x = 1;
int y = ++x;
System.out.println(x); // 2
System.out.println(y); // 2
int y = x++;
中,x是 先把x赋值给y,然后自增。
int y = ++x;
中,x是 先自增,然后赋值给y。
# 赋值运算符
运算符 | 运算规则 | 范例 | 结果 |
---|---|---|---|
= | 赋值 | int a=2 | 2 |
+= | 加后赋值 | int a=2,a+=2 | 4 |
-= | 减后赋值 | int a=2,a-=2 | 0 |
*= | 乘后赋值 | int a=2,a*=2 | 4 |
/= | 整除后赋值 | int a=2,a/=2 | 1 |
%= | 取模后赋值 | int a=2,a%=2 | 0 |
int x = 1;
x+=2; //相当于 x = x + 2
System.out.println(x); // 3
+=这种形式的赋值运算符,会将结果自动强转成等号左边的数据类型:
eg:
byte x = 20;
x += 30;// 相当于 x = (byte)(x+30);
System.out.println(x); //50
# 比较运算符
运算符 | 运算规则 | 范例 | 结果 |
---|---|---|---|
== | 相等于 | 4==3 | false |
!= | 不等于 | 4!=3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 | false |
>= | 大于等于 | 4>=3 | true |
赋值运算符的 = 符号,是用来将 = 符号右边的值,赋值给 = 符号左边的变量;
比较运算符的 == 符号,是用来判断 == 符号 左右变量的值是否相等的。
比较运算符 表达式返回的是一个boolean类型的结果。
eg:
int x = 2;
int y = 1;
System.out.println(x > y); //true
# 逻辑运算符
运算符 | 运算规则 | 范例 | 结果 |
---|---|---|---|
! | 非 | !true | false |
&& | 逻辑或操作符,有一个false结果为false | false&&true | false |
|| | 逻辑非运算符,有一个true结果就为true | false||true | true |
!
表示取反
eg:
boolean a = true;
boolean b = false;
System.out.println(!a); //false
System.out.println(a && b && a); //false
System.out.println(a || b || b); //true
&& 有一个优化,假如第一个为false,就会直接返回false,不会执行后面的判断
比如说
b && a && a
只要 b 是false,不需要再判断后面的 a 就可以直接返回结果。
# 条件运算符
条件运算符也被称为三元运算符。该运算符有3个操作数,并且需要判断布尔表达式的值。
常见的三元运算符是 ?:
eg:
String str = 2 > 1 ? "大于1" : "小于1";
System.out.println(str); //大于1
2 > 1 ? "大于1" : "小于1"
中
第一个表达式即2 > 1
是一个布尔型的判断
如果第一个参数为true ,则执行第二个表达式"大于1"
,即:
左侧
如果第一个参数为false ,则执行第三个表达式"小于1"
,即:
右侧
# 位运算符
运算符 | 运算规则 | 范例 | 结果 |
---|---|---|---|
& | 与,两个操作数中位都为1,结果才为1, 否则结果为0 | false&true | false |
| | 或,两个操作数中有一个为1,结果就为1 | false|true | true |
^ | 异或,相同 则为 0,不相同 则为1 | true^flase | true |
~ | 非,取反 | ~ (-2) | 1 |
<< | 按位左移运算符 | 3 << 3 | 得到24 |
>> | 带符号按位右移运算符 | 16 >> 2 | 得到4即 00000100 |
>>> | 无符号按位右移运算符 | -4 >>> 2 | 得到-1 |
true 可以 理解为 1,false 可以理解为 0
位运算符是按照位进行运算的,计算机中 1byte 字节=8 bit 位
。
eg:
8的二进制表示:
1000
右移两位后:
10
即2
eg2:
-8>>2
-8的二进制:
11111111111111111111111111111000
右移两位:(前面补符号位 即 补 11)
11111111111111111111111111111110
eg3:
-8>>>2
-8 二进制 表示:
11111111111111111111111111111000
前面补两位:
00111111111111111111111111111110
明显是着正数,正数补码和原码相同,所以00111111111111111111111111111110的原值是1073741822
1073741822
eg4:
8 & 1 结果为
8的二进制表示:
1000
1的二进制表示:
0001
& 结果为
0000
即0
位运算符比较复杂,一般在代码中比较少用到。
面试中,业务中 用到的地方不多,可以忽略,如果要详细学习,需要先学习一下原码、补码、反码。这就涉及计算机基础了,这里不展开了。
# Java运算符优先级
在Java的计算表达式中,运算优先级从高到低依次是:
()
!
~
++
--
*
/
%
+
-
<<
>>
>>>
&
|
+=
-=
*=
/=
eg:
int i = 1;
System.out.println(1 + 2 * 4 / i++); // 9
这里记住括号优先级最高就行,所以业务中使用括号要更加明了。