网站首页 > 技术文章 正文
1 什么是运算符
运算符是编程语言中用于执行各种操作的特殊符号或关键字。它们用于处理变量和值,执行数学计算、逻辑运算、位运算和其他操作,以便编写复杂的程序。运算符允许程序员在代码中执行各种操作,从而实现所需的功能。
2 Java运算符的分类
- 算术运算符: 用于执行基本的数学运算,加法、减法、乘法、除法和取模(取余)等。例如,+ 表示加法运算,- 表示减法运算。
- 关系运算符: 用于比较两个值的关系,如等于、不等于、大于、小于等。关系运算符返回布尔值(true 或 false),用于条件判断。例如,== 表示等于运算,< 表示小于运算。
- 逻辑运算符: 用于执行逻辑运算,如逻辑与、逻辑或和逻辑非等。逻辑运算符通常用于布尔值的操作,它们返回布尔结果。例如,&& 表示逻辑与,|| 表示逻辑或,! 表示逻辑非。
- 赋值运算符: 用于将值赋给变量,如 = 表示赋值运算,+= 表示加并赋值。
- 自增和自减运算符: 用于增加或减少变量的值,例如 ++ 表示自增,-- 表示自减。
- 位运算符: 用于执行位级别的操作,如按位与、按位或、按位异或和位移操作等。位运算符通常用于整数数据类型。例如,& 表示按位与,| 表示按位或,<< 表示左移。
- 条件运算符(三元运算符): 用于根据条件选择值,例如 ? : 表示条件运算符。
- 实例关系运算符: 用于比较对象引用,如 instanceof 用于检查对象是否是特定类的实例。
- 类型转换运算符: 用于将值从一种数据类型转换为另一种数据类型,如强制类型转换。
3 算式运算符
基本的四则运算 加减乘除模
- +:加法 两数相加
- -:减法 两数相减
- *:乘法 两数相乘
- /:除法 两数相除(两边都是整型时,进行整型运算)
- %:取模 两数取余(两个数必须是整数)
int a = 20;
int b = 10;
System.out.println(a + b);//30
System.out.println(a - b);//10
System.out.println(a * b);//200
System.out.println(a / b);//2
System.out.println(a % b);//0
注意事项:
- 算式运算符都是二元运算符需要两个操作数
- / % 的第二个操作数不能为0
- /:int / int 结果还是int类型,而且会向下取整
4 关系运算符
用于比较两个值的关系,返回布尔值。
- ==:等于
- !=:不等于
- <:小于
- :大于
- <=:小于等于
- =:大于等于
int num1 = 3;
int num2 = 0;
System.out.println(num1 == num2);//false
System.out.println(num1 != num2);//true
System.out.println(num1 < num2);//false
System.out.println(num1 > num2);//true
System.out.println(num1 <= num2);//false
System.out.println(num1 >= num2);//true
注意事项:
当需要多次判断时,不能连着写,比如:3 < a < 5,Java程序与数学中是有区别的
5 逻辑运算符
用于执行逻辑运算,返回布尔值。且两边的变量表达式都要是boolean类型的。
- &&:逻辑与(与)
- ||:逻辑或(或)
- !:逻辑非(非)
1 逻辑与 &&
语法规则:表达式1 && 表达式2,左右表达式必须是boolean类型的结果。 相当于现实生活中的且,比如:如果是学生,并且 带有学生证 才可以享受半票。 两个表达式都为真,结果才是真,只要有一个是假,结果就是假。
int a = 1;
int b = 2;
System.out.println(a == 1 && b == 2); // 左为真 且 右为真 则结果为真
2 逻辑或 ||
语法规则:表达式1 || 表达式2,左右表达式必须是boolean类型的结果。 相当于现实生活中的或,比如:买房子交钱时,全款 或者 按揭都可以,如果全款或者按揭,房子都是你的,否则站一边去。
int a = 1;
int b = 2;
System.out.println(a == 1 || b == 2); // 左为真 且 右为真 则结果为真
注意:&& 和 || 都是短路逻辑运算符
int a = 1;
int b = 2;
System.out.println(a++ > 0 || b++ >0);//true
system.out.println(a);//2
system.out.println(b);//2
短路逻辑运算符:||如果左边为真,右边不执行。
int a = 1;
int b = 2;
System.out.println(a++ < 0 && b++ >0);//true
system.out.println(a);//2
system.out.println(b);//2
短路运算符:&&如果左边为假,右边不执行。
3 逻辑非 !
语法规则:! 表达式
真变假,假变真。
int a = 1;
System.out.println(!(a == 1)); // a == 1 为true,取个非就是false
System.out.println(!(a != 1)); // a != 1 为false,取个非就是true
注意事项:
表达式都必须是布尔类型的。
6 赋值运算符
用于将值分配给变量。
- =:赋值
- +=:加并赋值
- -=:减并赋值
- *=:乘并赋值
- /=:除并赋值
- %=:取模并赋值
该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。
int x = 10;
x += 3;//13
x -= 3;//10
x *= 3;//30
x /= 3;//10
x %= 3;//1
注意事项:
赋值运算符都是先把左边的计算完,在赋值给右边。x += 3+5是等价于x = x + (3 + 5)
7 自增、自减运算符
用于增加或减少变量的值。
- ++:自增
- --:自减
int a = 3;
int b = a++;
System.out.println(a);//4
System.out.println(b);//3
int c = 3;
int d = --c;
System.out.println(c);//2
System.out.println(d);//2
后置++或者–都是先使用变量原来的值,然后在加加或者减减。
前置++或者–都是先加加或者减减,在使用变量的加加减减的值。
注意事项:
- 如果单独使用,前置和后置没有区别。
- 只有变量才能使用自增或者自减运算符。
- 自增/自减运算可以用于整数类型 byte、short、int、long,浮点类型 float、double,以及字符串类型 char。
- 在 Java 1.5 以上版本中,自增/自减运算可以用于基本类型对应的包装器类 Byte、Short、Integer、Long、Float、Double 和 Character。
8 位运算符
用于执行位级别的操作。
- &:按位与
- |:按位或
- ^:按位异或
- ~:按位非
- <<:左移
- :带符号右移
- :无符号右移
1 按位与 &
对两个操作数的每个位执行与操作,只有两个操作数的对应位都为1时,结果位才为1。例如,1101 & 1010 的结果是 1000。
2 按位或 | 对两个操作数的每个位执行或操作,只要两个操作数的对应位中有一个为1,结果位就为1。例如,1101 | 1010 的结果是 1111。
3 按位异或 ^
对两个操作数的每个位执行异或操作,只有两个操作数的对应位不相同时,结果位才为1。例如,1101 ^ 1010 的结果是 0111。
重要结论:
- a ^ 0 等于a
- a ^ a 等于0
4 按位非~
对单个操作数的每个位执行非操作,将0变为1,将1变为0。例如,~1101 的结果是 0010。
5 左移<<
将操作数的二进制位向左移动指定的位数,右侧用0填充。例如,5 << 2 的结果是 20,因为 5 的二进制表示是 101,左移两位后变成 10100,即十进制的 20。左移几位就是相当于乘以2^n。
6 带符号右移>>
将操作数的二进制位向右移动指定的位数,根据最高位的值用0或1填充。这保持了有符号数的符号(正负号)。例如,-8 >> 1 的结果是 -4,因为 -8 的二进制表示是 11111111111111111111111111111000,带符号右移1位后变成 11111111111111111111111111111100,即十进制的 -4。
7无符号右移>>> 类似于带符号右移,但不保留符号位,始终用0填充。这适用于无符号整数。例如,-8 >>> 1 的结果是 2147483644,因为它的二进制表示与带符号右移相同,但不考虑符号。
注意事项:
- 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
- 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
- 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
- 移动负数位或者移位位数过大都没有意义.
9 三目运算符(条件运算符)
条件运算符只有一个:
- 表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;
当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.
也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法
// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;
注意事项:
- 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
- 表达式不能单独存在,其产生的结果必须要被使用
10 实例关系运算符
用于比较对象引用。
instanceof:检查对象是否是特定类的实例 如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真。
String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真
如果被比较的对象兼容于右侧类型,该运算符仍然返回 true。
class Vehicle {}
public class Car extends Vehicle {
public static void main(String[] args){
Vehicle a = new Car();
boolean result = a instanceof Car;
System.out.println( result);
}
}
11 类型转换运算符
用于将值从一种类型转换为另一种类型。
(type):强制类型转换
long a = 10;
int b = (int)a;
12 运算符优先级
在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:* 和 / 的优先级要高于 +和 - ,有些情况下稍不注意,可能就会造成很大的麻烦。
只需要记住:在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:* 和 / 的优先级要高于 +和 - ,有些情况下稍不注意,可能就会造成很大的麻烦。
- 优先级:计算的先后顺序,以算术运算符为例,其默认的顺序是先乘除、后加减。但是可以通过()来改变计算的先后顺序。
如下表格汇总所有运算符的优先级,优先级的数字越大越会优先计算,其中括号的优先级是最高的。
由于Java的运算符比较多,要记住它们的优先级顺序比较困难,因此建议在开发项目中有以下建议。
- 不要太过于依赖运算的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用括号()来表达式的执行顺序。
- 不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分解成几步来完成。
猜你喜欢
- 2024-10-27 从bitmap到布隆过滤器,再到高并发缓存设计策略
- 2024-10-27 强大 WebView2 + 不用写 JavaScript 的 htmx.js 「小轻快」开发桌面程序
- 2024-10-27 《JSP》第13节:JSP中的四大作用域介绍
- 2024-10-27 Java,FreeMarker,模板引擎,通过案例代码,学懂模板引擎
- 2024-10-27 面向对象的三大特性(c++面向对象的三大特性)
- 2024-10-27 教你分析9种 OOM 常见原因及解决方案
- 2024-10-27 可动态调节参数的线程池实现(动态调试工具有哪些)
- 2024-10-27 Java,基本类型和引用类型,强引用、软引用、弱引用、虚引用
- 2024-10-27 深入理解Java:类加载机制及反射(java常见类加载器)
- 2024-10-27 JVM系列-6.javap指令介绍(jvm调优)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)