java第三讲(运算符)

Java 第三讲:运算符(Operators)

这一讲是 Java 入门阶段最核心的内容之一,几乎所有后续的判断、循环、计算都建立在运算符的基础上。建议边看边在 IDE 里敲代码验证(推荐 IntelliJ IDEA Community 或 Eclipse)。

1. 运算符分类总览(Java 共 8 大类)

分类符号示例作用简述优先级层级(大致)
算术运算符+ – * / % ++ —数学计算
赋值运算符= += -= *= /= %= &= |= ^= <<= >>= >>>=给变量赋值(带计算的快捷形式)最低
关系/比较运算符> < >= <= == !=比较大小/是否相等,返回 boolean中等
逻辑运算符&& || ! ^逻辑与/或/非/异或中等偏低
位运算符& | ^ ~ << >> >>>二进制位操作中等
移位运算符<< >> >>>位左移/右移/无符号右移中等
条件/三元运算符? :简洁的 if-else较高
instanceofinstanceof类型判断中等
其他. () [] new点运算、括号、数组、创建对象最高

2. 重点详解 + 代码示例(最常考/最易错部分)

2.1 算术运算符(Arithmetic Operators)

int a = 10, b = 3;

System.out.println(a + b);   // 13
System.out.println(a - b);   // 7
System.out.println(a * b);   // 30
System.out.println(a / b);   // 3   (整数除法,向下取整)
System.out.println(a % b);   // 1   (余数)

double c = 10.0 / 3;         // 3.3333333333333335
System.out.println(c);

// 自增/自减(最容易错!)
int x = 5;
int y = x++;   // 先赋值,后自增 → y=5, x=6
int z = ++x;   // 先自增,后赋值 → z=7, x=7

System.out.println("y=" + y + ", z=" + z + ", x=" + x);  // y=5, z=7, x=7

经典面试题

int i = 1;
i = i++;     // i 最后是多少?  → 1(先赋值1给临时变量,再i+1,但结果没接收)

2.2 关系运算符(Relational Operators)

结果永远是 boolean 类型

int age = 20;
boolean isAdult = age >= 18;     // true
boolean eq = (age == 20);        // true
boolean ne = (age != 21);        // true

2.3 逻辑运算符(Logical Operators)——短路 vs 非短路

运算符含义是否短路特点
&&逻辑与左边false → 右边不执行
&逻辑与两边都执行(很少用)
||逻辑或左边true → 右边不执行
|逻辑或两边都执行
!逻辑非取反
^逻辑异或两边不同为true
int score = 85;
boolean pass = score >= 60 && score <= 100;   // true

// 短路特性演示(非常重要!)
int n = 0;
boolean res = (n != 0) && (10 / n > 2);   // 不会除0异常,因为短路
// 如果写成 & 就会报 ArithmeticException: / by zero

2.4 三元(条件)运算符(Ternary Operator)——最优雅的 if-else 替代

语法:条件 ? 表达式1 : 表达式2

int a = 10, b = 20;
int max = (a > b) ? a : b;          // 20

String level = (score >= 90) ? "优秀" 
             : (score >= 80) ? "良好" 
             : (score >= 60) ? "及格" : "不及格";

// 经典用法:避免空指针
String name = user != null ? user.getName() : "匿名";

2.5 赋值运算符(Assignment Operators)——复合赋值

int x = 10;
x += 5;     // x = x + 5 → 15
x *= 2;     // x = x * 2 → 30
x >>= 2;    // x = x >> 2(右移2位)

2.6 位运算符 & 移位(面试高频)

int a = 0b1010;   // 10
int b = 0b1100;   // 12

System.out.println(a & b);   // 8   → 1000
System.out.println(a | b);   // 14  → 1110
System.out.println(a ^ b);   // 6   → 0110  (异或:不同为1)
System.out.println(~a);      // -11 (按位取反,注意符号位)

// 移位(效率极高,常用于性能优化)
System.out.println(8 << 2);   // 32   → 8 * 4
System.out.println(32 >> 3);  // 4    → 32 / 8
System.out.println(-8 >>> 2); // 大正数(无符号右移,补0)

经典技巧

  • 判断奇偶:n & 1 == 1 → 奇数
  • 2的幂次快速乘除:x << 3 = x * 8
  • 交换两数(不使用临时变量):a ^= b; b ^= a; a ^= b;

3. 运算符优先级表(必须烂熟于心,括号最高)

从高到低(同一行优先级相同,从左→右结合,除赋值类从右→左):

  1. () . [] ++ — ! ~ (一元)
  2. * / %
  3. + –
  4. << >> >>>
  5. < <= > >= instanceof
  6. == !=
  7. &(位与)
  8. ^(位异或)
  9. |(位或)
  10. &&
  11. ||
  12. ? :(三元)
  13. = += -= *= /= %= &= |= ^= <<= >>= >>>=(赋值,从右向左)

口诀记忆
单目算术移,乘除加减比,位与异或或,逻辑三元赋

4. 常见坑 & 面试题速览

  1. i = i++ 结果是多少?(仍为原值)
  2. String s = 5 + 5 + "5" 输出什么?(”105″)
  3. short s = 1; s = s + 1; 编译报错吗?(报错,需强制转换)
  4. char c = 'A' + 1; 结果是多少?(’B’)
  5. boolean b = true ^ true; 结果?(false)

5. 练习建议(今天必须写完)

  1. 用三元运算符判断闰年(能被4整除但不能被100整除,或能被400整除)
  2. 用位运算实现:判断一个数是否是 2 的整数次幂
  3. 写出下面表达式的值:
   int x = 3, y = 4, z = 5;
   boolean res = x++ > 3 && ++y > 4 || z-- < 5;
   System.out.println(x + "," + y + "," + z + "," + res);

有哪道题不会?或者想重点看哪类运算符的更多例子(位运算/三元/短路)?直接说,我继续给你展开!

文章已创建 4665

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部