Java 运算符

张开发
2026/5/4 13:48:54 15 分钟阅读
Java 运算符
Java 运算符学习笔记详细版一、概述运算符Operator是用于对变量、常量或表达式进行操作的符号。Java 提供了丰富的运算符涵盖了算术、关系、逻辑、位运算等多个方面。表达式由运算符和操作数变量、常量组成的序列例如a b。二、算术运算符 (Arithmetic Operators)用于基本的数学运算。运算符描述示例结果加法 / 字符串连接10 5/Hi !15/Hi!-减法10 - 55*乘法10 * 550/除法10 / 33(整数除法)%取模 (取余)10 % 31自增 (加 1)a/aa变为a1--自减 (减 1)a--/--aa变为a-11. 除法与取模的特殊性整数除法两个整数相除结果仍为整数小数部分被截断非四舍五入。inta10/3;// 结果 3doubleb10.0/3;// 结果 3.333... (至少有一个操作数是浮点数)取模运算结果的符号与被除数相同。System.out.println(10%3);// 1System.out.println(-10%3);// -1System.out.println(10%-3);// 12. 自增 () 与自减 (--)分为前缀和后缀两种形式区别在于返回值的时机。形式含义执行顺序示例代码输出结果a(前缀)先加后用1.a加 12. 返回新值int a1; int ba;a2, b2a(后缀)先用后加1. 返回旧值2.a加 1int a1; int ba;a2, b1注意如果单独作为语句使用如a;前缀和后缀效果一样。三、赋值运算符 (Assignment Operators)用于将右侧的值赋给左侧的变量。运算符描述等价表达式简单赋值a 10加后赋值a ba (type)(a b)-减后赋值a - ba (type)(a - b)*乘后赋值a * ba (type)(a * b)/除后赋值a / ba (type)(a / b)%取模后赋值a % ba (type)(a % b)重要特性隐式类型转换复合赋值运算符会自动进行类型转换而简单赋值不会。shorts10;// s s 5; // ❌ 编译错误s5 是 int 类型不能直接赋给 shorts5;// ✅ 编译通过等价于 s (short)(s 5)四、关系运算符 (Relational Operators)用于比较两个值的大小或相等性结果永远是boolean类型(true或false)。运算符描述示例等于a b!不等于a ! b大于a b小于a b大于等于a b小于等于a b注意比较对象引用类型时比较的是内存地址equals()比较的是内容。Strings1newString(abc);Strings2newString(abc);System.out.println(s1s2);// false (地址不同)System.out.println(s1.equals(s2));// true (内容相同)五、逻辑运算符 (Logical Operators)用于连接布尔表达式结果也是boolean。运算符描述示例逻辑短路与a b全真为真一假即假。若 a 为假不计算 b。逻辑与a b全真为真一假即假。无论 a 如何都计算 b。||短路或a || b一真即真全假为假。若 a 为真不计算 b。|逻辑或a || b一真即真全假为假。无论 a 如何都计算 b。!非!a真变假假变真。^异或a ^ b相同为假不同为真。1. 短路特性 (vs,\|\|vs\|)短路 (,\|\|)效率高常用于防止空指针异常。Stringstrnull;// if (str ! null str.length() 0) { ... } // ✅ 安全str为null时不执行后面// if (str ! null str.length() 0) { ... } // ❌ 报错即使前面为假后面也会执行非短路 (,\|)无论左边结果如何右边都会执行。常用于位运算或需要两边都产生副作用的场景。2. 异或 (^)当两个操作数不同时结果为true。常用于加密、标志位切换。System.out.println(true^true);// falseSystem.out.println(true^false);// true六、位运算符 (Bitwise Operators)直接对二进制位进行操作操作数必须是整数类型 (byte,short,int,long,char)。运算符描述示例 (二进制)结果按位与5 3(101 011)1(001)|按位或5 | 3(101 | 011)7(111)^按位异或5 ^ 3(101 ^ 011)6(110)~按位取反~5(~101)-6(补码)左移5 1(101 - 1010)10(相当于*2)右移 (算术)5 1(101 - 010)2(相当于/2)无符号右移-5 1高位补 0位运算技巧判断奇偶n 1结果为 1 是奇数0 是偶数。交换变量不借助临时变量aa^b;ba^b;// 相当于 (a^b)^b aaa^b;// 相当于 (a^b)^a b移位效率n 1等价于n * 2n 1等价于n / 2效率略高于乘除。七、三元运算符 (Ternary Operator)Java 唯一的三目运算符用于简化if-else结构。语法条件表达式?表达式1:表达式2执行逻辑如果条件为true返回表达式1的值。如果条件为false返回表达式2的值。示例inta10,b20;intmax(ab)?a:b;// max 20Stringstatus(age18)?成年:未成年;注意三元运算符的两个分支表达式1和2必须有兼容的类型或者能自动转换为同一类型。嵌套使用会降低可读性建议不超过一层。八、其他运算符1.instanceof(类型判断)用于判断对象是否属于某个类或其子类的实例。ObjectobjHello;if(objinstanceofString){Strings(String)obj;// 安全强转}2.new(实例化)用于创建对象或数组。PersonpnewPerson();int[]arrnewint[10];3. 逗号运算符 (,)在for循环中用于分隔多个变量声明或更新。for(inti0,j10;ij;i,j--){// ...}注意Java 中逗号运算符不能像 C 语言那样在任意表达式中使用。九、运算符优先级 (Precedence)当表达式中包含多个运算符时优先级决定了运算顺序。优先级运算符结合性1 (最高)(),[],.从左到右2,--,(正),-(负),!,~从右到左3*,/,%从左到右4,-从左到右5,,从左到右6,,,从左到右7,!从左到右8从左到右9^从左到左10|从左到右11从左到右12||从左到右13? :从右到左14,,-…从右到左15 (最低),从左到右记忆口诀单目乘除为关系逻辑三目后赋值。(单目 算术 关系 逻辑 三目 赋值)建议如果不确定优先级务必使用括号()来明确运算顺序提高代码可读性。// 不推荐intresultab*cde;// 推荐intresult(a(b*c)d)e;十、常见易错点与最佳实践1.与equals()的混淆基本类型只能用比较值。引用类型比较地址是否是同一个对象。equals()比较内容是否逻辑相等。注意String类重写了equals()所以比较字符串内容要用equals()。2. 浮点数比较浮点数运算存在精度误差不要直接用比较浮点数。正确做法判断差值是否在一个极小的范围内。doublea0.10.2;doubleb0.3;// if (a b) { ... } // ❌ 可能为 falseif(Math.abs(a-b)1e-6){...}// ✅ 推荐3. 短路逻辑的副作用如果右侧表达式有副作用如修改变量、调用方法使用或\|\|可能导致副作用不执行。intx0;if(false(x1)1){...}// x 仍然是 0因为短路了4. 整数溢出运算结果超过类型范围会溢出不会报错而是“绕回”。intmaxInteger.MAX_VALUE;intoverflowmax1;// 结果是 Integer.MIN_VALUE5. 位运算的符号位右移会保留符号位负数补 1无符号右移总是补 0。处理负数移位时要小心。十一、总结速查表类别核心运算符关键点算术,-,*,/,%,,--整数除法截断前后缀区别赋值,,-…复合赋值自动强转关系,!,,…结果 boolean对象比较用equals逻辑,||,!,^短路特性^异或位运算,|,^,~,,,二进制操作相当于乘 2三元? :简化 if-else注意类型兼容其他instanceof,new类型判断对象创建掌握运算符及其优先级是编写正确、高效 Java 代码的基础。在实际开发中优先使用可读性强的写法必要时使用括号明确优先级。

更多文章