运算符
Java 语言支持如下运算符:
- 算术运算符 +,-,*,/,%,++,--
- 赋值运算符 =
- 关系运算符 >,<,>=,<=,==,!= instanceof
- 逻辑运算符 &&,||,!
- 位运算符 &,|,^,~ , >>,<<,>>> (了解!!!)
- 条件运算符 ?:
- 扩展赋值运算符 +=,-=,*=,/=
1.二元运算
两个操作数
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 25;
int d = 25;
System.out.println("a + b = " + (a + b) );
System.out.println("a - b = " + (a - b) );
System.out.println("a * b = " + (a * b) );
System.out.println("b / a = " + (b / a) );
}
整数运算
如果两个或多个操作数中有一个为Long, 则结果也是Long
没有long时,结果为int。即使操作数全为shot,byte,结果也是int.
public static void main(String[] args) {
long a = 1231321311231231L;
int b = 1213;
short c = 10;
byte d = 8;
System.out.println(a + b + c + d); //Long类型
System.out.println(b + c + d);//Int类型
System.out.println(c + d);//Int类型
}
浮点运算
如果两个或多个操作数有一个为double, 则结果为double
只有表达表操作数都是float, 则结果才为float
public static void main(String[] args) {
float a = 3.14565F;
double b = 3.194546464;
float c = 1.3123123F;
System.out.println(a+b); //double类型
System.out.println(b+c); //double类型
System.out.println(a+c); //float类型
}
关系运算符
运算符 | 描述 | 例子 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则为真 | (4 == 5)为假 |
!= | 检查两个操作数的值是否相等,如果不相等则为真 | (5 != 5)为假 |
> | 检查左操作数的值是否大于右操作数的值,如果大于则为真 | (5 > 4)为真 |
< | 检查左操作数的值是否小于右操作数的值,如果小于则为真 | (5 < 4)为假 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果大于或等于则为真 | (5 >= 5)为真 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果小于或等于则为真 | (5 =< 4)为假 |
2.取模运算
在计算机中,除法分两种,对整数做除法运算以及对浮点数做除法运算;除法运算符号也分两种,/ 是对两被除数取整,% 是对被除数取余
5%3 余 2
5/3 得1
-
浮点数做除法运算
double num_dou1 = 7.0; double num_dou2 = 2; System.out.println("dou = " + num_dou1 / num_dou2);//dou = 3.5 System.out.println("dou = " + num_dou1 % num_dou2);//dou = 1.0
-
整数做除法运算
int num_int1 = 5; int num_int2 = 2; System.out.println("int1 = " + num_int1 / num_int2);//int1 = 2 System.out.println("int2 = " + num_int1 % num_int2);//int1 = 1
-
浮点数与整数做除法运算
int num_int2 = 2; double num_dou1 = 7.0; System.out.println("int&dou1 = " + num_dou1 / num_int2);//int&dou1 = 3.5 System.out.println("int&dou2 = " + num_dou1 % num_int2);//int&dou2 = 1.0
由上可以得出浮点数与浮点数或整数做取整反回的是带小数的,而整数对整数取整反回的还是整数,如果不想丢失精度,那在做取整时,把整数转浮点数再求值
负数%负数=负数;
负数%正数=负数;
正数%负数=正数;
3.一元运算符
自增(++)自减(--)运算符是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算, 而自增自减运算符是一个操作数,分为前缀和后缀两种。
int a = 5;
int b = a++;//后置的++是先给b赋值,然后再自增
System.out.println(b);//5,因为b是在a自增前赋值的
int c = ++b;//前置的++是先自增,然后再给c赋值
System.out.println(a);//6,因为在赋值给b后自增了1
System.out.println(b);//6,因为在赋值给c前自增了1
System.out.println(c);//6,因为b是在a自增前赋值的,而c是在b自增后赋值的
幂运算
在数字运算中,2^3 = 2*2*2 = 8
,但在java中 ^ 是异或符号
double pow = Math.pow(2,3);
System.out.println(pow);//8.0
//在java中有一些工具类可以用来做数字运算
4.逻辑运算符
逻辑与:&&和&
逻辑或:||和|
逻辑非:!
运算符 | 描述 | 例子 |
---|---|---|
&& | 当且仅当两个操作数都为真,条件才为真 | (true && false) 为假 |
|| | 当且仅当两个操作数任一为真,条件为真 | (true && false) 为真 |
! | 如果条作为true则条件为假,反之为真 | (!true) 为假 |
例子的true和false可以为表达式,但表达式的结果必须是boolean布尔值。
逻辑与 和 逻辑或 采用短路的方式。逻辑与只要有一个为false, 则直接返回false;逻辑或只要有一个为true, 则直接返回true
从左到右计算,如果确定值则不会再计算下去。在两个操作数都为 true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断 第二个操作了。
int a = 5;
boolean flag = (a < 4) && (a++ < 10);
System.out.println(flag);//false
System.out.println(a);//5
//首先判断 a<4 的结果为 false,则 b 的结果必定是 false, 所以不再执行第二个操作 a++<10 的判断
flag = (a == 5) || (--a > 4);
System.out.println(flag);//true
System.out.println(a);//5
//首先判断 a == 5 的结果为 true,则不管 b 的结果是啥,不再执行第二个操作 --a < 4 的判断
5.位运算符
计算机中的所有信息都是以二进制方式表示的,数字是以其二进制的补码存储的
而对于正数来说,其二进制原码,反码,补码均为相同的;对于负数来说,其反码为符号位保持不变,其余各位取反后再在最后一位上加1
位运算符作用在所有的位上,并且按位运算,在二进制中,每个 1|0 都是一个位
运算符 | 描述 | 例子 |
---|---|---|
& | 两组二进制数如果相对应位都是1,则结果为1,反之则为0 | (3 & 4)得0 |
| | 两组二进制数如果相对应位都是0,则结果为0,反之则为1 | (3 | 4) 得7 |
^ | 两组二进制数如果相对应位值相同,则结果为0,反之则为1 | (7 ^ 9) 得14 |
~ | 对这组二进制数每一位按位取反,即0变成1,1变成0 | (~60) 得-61 |
<< | 对这组二进制数按位左移右操作数指定的位数 | (2 << 2)得8 |
>> | 对这组二进制数按位右移左操作数指定的位数 | (4>>2)得1 |
>>> | 对这组二进制数按位右移左操作数指定的位数,移动得到的空位以0填充 | (60>>>2)得15 |
/*
a = 0011 1100 = 60
b = 0000 1101 = 13
==================
a&b= 0000 1100 = 12
a|b= 0011 1101 = 61
a^b= 0011 0001 = 49
~a = 1100 0011 = -61
*/
右移一位相当于除2取商;左移一位相当于乘2
//2*8怎样运算效率最快
int a = 2;
System.out.println(a << 3);
//2乘以8 == 2*2*2*2 == 2左移3位
//在系统中运算是以二进制的形式进行的,相比来说俩个二进制数相乘运算比移位运算慢一些
6.扩展运算符
运算符 | 描述 | 例子 |
---|---|---|
+= | 把左操作数和右操作数相加再赋值回左操作数 | a+=b |
-= | 把左操作数和右操作数相减再赋值回左操作数 | a-=b |
*= | 把左操作数和右操作数相乘再赋值回左操作数 | a*=b |
/= | 把左操作数和右操作数取余再赋值回左操作数 | a/=b |
%= | 把左操作数和右操作数取整再赋值回左操作数 | a%=b |
7.字符串连接符
在java中一般让两个字符串类型的操作数连接会用 “+” 运算符;如果两个操作数中只有一个是字符串类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
String s1 = " age ";
String s2 = s1 + 24;
int age = 24;
int num = 31;
System.out.println(s2);// age 24
System.out.println(s1 + age);// age 24
System.out.println(s1 + age + num);// age 2431
System.out.println(age + num + s1);//55 age
//s1 + age + num,是让s1和age进行字符串拼接,再拼接num
//age + num + s1,是计算完age + num,再与字符串s1拼接
8.三目条件运算符
三目条件运算符是按条件来返回需要的结果,格式
x ? y : z
其中x为boolean类型表达式,先计算x的值,若为true,则整个三目运算的结果为表达式y的值,否则整个运算结果为表达式z的值。
int score = 80;
String type = score < 60 ? "不及格" : "及格";
System.out.println("type= " + type);
利用三元运算符做到更加精简代码!便于理解!
9.运算符优先级
先加减,后乘除,所以优先级我们并不陌生。
当多个运算符出现在一个表达式中,就涉及到运算符的优先级别的问题。
下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部
类别 | 操作符 | 关联性 |
---|---|---|
后缀 | () [] . (点操作符) | 左到右 |
一元 | expr++ expr-- | 从左到右 |
一元 | ++expr --expr + - ~ ! | 从右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | > >= < <= | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | | | | 左到右 |
条件 | ?: | 从右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
逗号 | , | 左到右 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!