java第三讲(运算符)

java第三讲(运算符)

文章目录

Java 运算符

一、运算符基础

定义:对操作数进行操作的符号,不同运算符操作含义不同。
Java 运算符分类:算术运算符、关系运算符、逻辑运算符、位运算符、移位运算符、条件运算符。

二、算术运算符

分为基本四则运算符增量运算符自增/自减运算符,是数值运算的核心。

1. 基本四则运算符:+ - * / %(加减乘除模)

特点:二元运算符,必须有左右两个操作数。
代码案例

int a =20;int b =10;System.out.println(a + b);// 30System.out.println(a - b);// 10System.out.println(a * b);// 200System.out.println(a / b);// 2System.out.println(a % b);// 0 (模运算=除法余数)

核心注意事项

操作数类型不一致时,向范围大的类型自动提升

System.out.println(1+0.2);// 1.2(int自动提升为double)

% 可对 double 取模(无实际意义,一般仅用于整型),运算结果符合取决于第一个数:

System.out.println(11.5%2.0);// 1.5System.out.println(10%3);//1System.out.println(-10%3);//-1

除法和取模的右操作数不能为0,否则抛出算术异常:

int a =1;int b =0;System.out.println(a / b);// 报错:ArithmeticException(算术异常): / by zero

int / int 结果仍为 int向下取整(舍弃小数点后所有数):

int a =3;int b =2;System.out.println(a / b);// 1(非1.5)// 想得到数学精确结果,需将其中一个数转为浮点型double d = a *1.0/ b;System.out.println(d);// 1.5

2. 增量运算符:+= -= *= /= %=

特点:运算结果自动赋值给左操作数,仅支持变量,不支持常量;可帮你进行类型转换。
代码案例

int a =1; a +=2;// 等价于 a = a + 2 → a=3System.out.println(a); a -=1;// 等价于 a = a - 1 → a=2System.out.println(a); a *=3;// 等价于 a = a * 3 → a=6System.out.println(a); a /=3;// 等价于 a = a / 3 → a=2System.out.println(a); a %=3;// 等价于 a = a % 3 → a=2System.out.println(a);int c =10;long d =20; c += d;System.out.println(c);//30

3. 自增/自减运算符:++ - -

作用++ 给变量+1,-- 给变量-1;仅支持变量,不支持常量。
核心区别:单独使用无区别,混合使用有先后顺序
代码案例

int a =1; a++;// 后置++,单独使用 → a=2++a;// 前置++,单独使用 → a=3// 混合使用:后置++ 先使用原值,表达式结束后+1System.out.println(a++);// 输出3,执行后a=4// 混合使用:前置++ 先+1,再使用新值System.out.println(++a);// 先a=5,再输出5// 自减-- 规则与自增++完全一致 a--;System.out.println(a--);// 输出4,执行后a=3--a;System.out.println(--a);// 先a=1,再输出1

三、关系运算符

常用符号== != < > <= >=(共6个)
核心特点:运算结果为布尔值(true/false)= 是赋值,== 才是判断相等。
代码案例

int a =10;int b =20;System.out.println(a == b);// falseSystem.out.println(a != b);// trueSystem.out.println(a < b);// trueSystem.out.println(a > b);// falseSystem.out.println(a <= b);// trueSystem.out.println(a >= b);// false

关键注意不能连续写多个关系运算符(与数学不同),如 3 < a < 5 是错误写法。

四、逻辑运算符(重点)

常用符号&& || !(逻辑与、逻辑或、逻辑非)
核心特点:操作数为布尔值,运算结果也为布尔值&&|| 支持短路求值

1. 逻辑与 &&:一假则假,全真才真

规则:左右表达式都为true,结果才为true;任意一个为false,结果为false。
代码案例

int a =1;int b =2;System.out.println(a ==1&& b ==2);// true(全真)System.out.println(a ==1&& b >100);// false(右假)System.out.println(a >100&& b ==2);// false(左假)System.out.println(a >100&& b >100);// false(全假)

2. 逻辑或 ||:一真则真,全假才假

规则:左右表达式任意一个为true,结果为true;都为false时,结果为false。
代码案例

int a =1;int b =2;System.out.println(a ==1|| b ==2);// true(全真)System.out.println(a ==1|| b >100);// true(左真)System.out.println(a >100|| b ==2);// true(右真)System.out.println(a >100|| b >100);// false(全假)

3. 逻辑非 !:真变假,假变真

规则:一元运算符,仅对一个布尔表达式取反。
代码案例

int a =1;System.out.println(!(a ==1));// false(原true取反)System.out.println(!(a !=1));// true(原false取反)

4. 短路求值(核心特性)

规则&& 左侧为false时,直接返回false,不计算右侧表达式|| 左侧为true时,直接返回true,不计算右侧表达式
代码案例(无异常,因右侧未执行):

// 10/0会抛异常,但此处因短路求值未执行System.out.println(10>20&&10/0==0);// falseSystem.out.println(10<20||10/0==0);// true

对比&| 作逻辑运算时不支持短路求值,会执行所有表达式,直接抛异常:

System.out.println(10>20&10/0==0);// 报错System.out.println(10<20|10/0==0);// 报错

五、位运算符

Java 中数据操作最小单位是比特位(0/1),位运算符按二进制位逐位运算;
常用符号& | ~ ^(按位与、按位或、按位取反、按位异或);除 ~ 是一元运算符,其余为二元。
注意:操作数为整数时是位运算,为布尔值时是逻辑运算(与&& ||区分)。

1. 按位与 &:两位都为1,结果为1,否则为0

代码案例

int a =10;// 二进制:00001010int b =20;// 二进制:00010100System.out.println(a & b);// 0(二进制:00000000)System.out.println(10< 20 & 10 >0);//都为真,true System.out.println(10>20&10>0);//第一个为假,falseSystem.out.println(10<20&10<0);//第二个为假。falseSystem.out.println(10>20&10<0);//都为假,false

2. 按位或 |:两位都为0,结果为0,否则为1

代码案例

int a =10;// 二进制:00001010int b =20;// 二进制:00010100System.out.println(a | b);// 30(二进制:00011110)

3. 按位取反 ~:0变1,1变0

代码案例(十六进制简化二进制,%x 按十六进制输出):

int a =0xf;// 0xf=15,二进制:00001111System.out.printf("%x\n",~a);// 按位取反后结果:ffffff0

4. 按位异或 ^:两位相同为0,不同为1

核心特性两个相同数异或结果为0
代码案例

int a =0x1;// 二进制:0001int b =0x2;// 二进制:0010System.out.printf("%x\n", a ^ b);// 3(二进制:0011)System.out.println(5^5);// 0(相同数异或为0)System.out.println(5^0);// 5(0异或任何数为当前那个数)

六、移位运算符(了解)

按二进制比特位移动,都是二元运算符符号<< >> >>>(左移、右移、无符号右移)。

1. 左移 <<:最左侧位舍弃,最右侧补0

规则:左移N位 ≈ 原数 × 2的N次方(计算效率高于乘除);
代码案例0x10 是十六进制,对应十进制16):

int a =0x10;System.out.printf("%x\n", a <<1);// 20(左移1位,16×2=32=0x20)

注意:左移会舍弃符号位,正数左移可能变成负数。

2. 右移 >>:最右侧位舍弃,最左侧补符号位(正数(符号位为0)补0,负数(符号位为1)补1)

规则:右移N位 ≈ 原数 ÷ 2的N次方;
代码案例

int a =0x10;System.out.printf("%x\n", a >>1);// 8(16÷2=8=0x8)int b =0xffff0000;// 负数System.out.printf("%x\n", b >>1);// ffff8000(左侧补1)int c =-1;System.out.println(c >>2);//-1

3. 无符号右移 >>>:最右侧位舍弃,最左侧统一补0(无论正负)

代码案例

int a =0xffffffff;// 负数System.out.printf("%x\n", a >>>1);// 7fffffff(左侧补0)

移位通用注意

  1. 移位效率远高于乘除,乘除2的N次方时优先用移位
  2. 移动负数位、移位位数过大,均无实际意义。

七、条件运算符

唯一符号表达式1 ? 表达式2 : 表达式3(Java 唯一三目运算符);
作用:简化条件判断,是 if-else 的简写形式。
执行规则

  • 表达式1为true → 整个表达式结果=表达式2的值;
  • 表达式1为false → 整个表达式结果=表达式3的值。

代码案例

// 求两个整数的最大值int a =10;int b =20;int max = a > b ? a : b;System.out.println(max);// 20//强化boolean flg =true==true?true==false?false:true:false;System.out.println(flg);//true

核心注意事项

条件表达式不能单独存在,运算结果必须被使用(赋值/输出等):

int a =10;int b =20; a > b ? a : b;// 报错:不是有效语句

表达式2和表达式3的结果类型必须一致(除非支持隐式类型转换):

int a =10;int b =20;int c = a > b ?1:2.0;// 错误:类型不匹配(int和double)

八、运算符的优先级

  1. 不同运算符优先级不同(如 * / 高于 + -+ - 高于移位运算符);
  2. 无需记忆优先级规则加括号即可消除表达式歧义,提升代码可读性。

代码案例

// 求a和b的平均值,错误写法(+优先级高于>>)int a =10;int b =20;int c = a +(b - a)>>1;// 等价于 (10+10)>>1 → 20>>1=10System.out.println(c);// 10// 正确写法:加括号明确运算顺序int d = a +((b - a)>>1);System.out.println(d);// 15

Read more

Flutter 三方库 http_client_interceptor 的鸿蒙化适配指南 - 实现原生 HttpClient 的全量请求拦截、支持端侧动态 Headers 注入与网络流量审计实战

Flutter 三方库 http_client_interceptor 的鸿蒙化适配指南 - 实现原生 HttpClient 的全量请求拦截、支持端侧动态 Headers 注入与网络流量审计实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 http_client_interceptor 的鸿蒙化适配指南 - 实现原生 HttpClient 的全量请求拦截、支持端侧动态 Headers 注入与网络流量审计实战 前言 在进行 Flutter for OpenHarmony 开发时,虽然我们常使用 dio 等高阶库,但仍有大量底层插件或遗留系统直接使用 Dart 原生的 HttpClient。如何在中途“截获”这些原生请求,以便统一添加鉴权 Token、日志审计或处理特定区域的网关重定向?http_client_interceptor 是一款专为原生 IO 库设计的拦截器插件。本文将探讨如何在鸿蒙端构建极致透明的网络治理层。 一、原直观解析 / 概念介绍 1.1 基础原理

By Ne0inhk
Flutter 三方库 dead_code_analyzer 的鸿蒙化适配指南 - 彻底清除无用代码、精简鸿蒙产物包体积、提升工程纯净度

Flutter 三方库 dead_code_analyzer 的鸿蒙化适配指南 - 彻底清除无用代码、精简鸿蒙产物包体积、提升工程纯净度

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 dead_code_analyzer 的鸿蒙化适配指南 - 彻底清除无用代码、精简鸿蒙产物包体积、提升工程纯净度 在鸿蒙跨平台开发的长期迭代中,废弃的业务逻辑、过时的工具函数就像“工程血栓”,不仅拖慢编译速度,还会无端增加最终 .app 包的体积。今天我们聊聊如何用 dead_code_analyzer 像外科医生一样精准切除这些冗余毒瘤。 前言 很多开发者认为“我不调用它,它就不占空间”。但在复杂的 Flutter 依赖树中,一些被标注为 public 但实际未引用的类,依然可能被编译器包含。特别是在 OpenHarmony 这种对包体积、启动性能有极致要求的系统下,工程的“纯净度”直接影响用户体验。 dead_code_analyzer 是一款专门针对

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 image_size_getter 零加载极速获取图片尺寸(鸿蒙 UI 布局优化必备)

Flutter for OpenHarmony: Flutter 三方库 image_size_getter 零加载极速获取图片尺寸(鸿蒙 UI 布局优化必备)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 应用布局时,我们经常遇到这样的挑战:为了防止 UI 抖动,需要在图片完全加载前预留一段占位空间。如果直接使用 Image.network 或 Image.file,直到图片解码完成前,我们都无法获知其宽高比。如果此时一次性加载大量高清大图,仅为了获取尺寸而消耗内存和流量,显然是不理智的。 image_size_getter 是一个极其聪明的库。它通过读取图片头部的少量二进制字节(通常只有几百字节),就能瞬间识别出 JPG、PNG、GIF、WebP 甚至 PSD 的原始尺寸。 一、核心原理图解 该库通过解析各种图片格式的 Header 结构实现免解码探测。 本地/网络图片文件 读取前 1KB 字节流 校验魔数

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 hashlib 为鸿蒙应用提供军用级加密哈希算法支持(安全数据完整性卫士)

Flutter for OpenHarmony: Flutter 三方库 hashlib 为鸿蒙应用提供军用级加密哈希算法支持(安全数据完整性卫士)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 OpenHarmony 应用开发中,涉及到本地存储加密、用户密码脱敏、大文件完整性校验或区块链应用时,一套算法完备、执行高效的哈希(Hash)库是必不可少的。虽然 Dart 原生也提供了一些简单的加密方法,但在算法多样性(如 Argon2、SHA-3, Blake2b 等高级算法)和性能表现方面,往往无法满足高安全等级项目的需求。 hashlib 正是专门为高性能数据加解密与完整性校验打造的库。它纯代码实现且经过了极致的循环优化,是鸿蒙平台上保护敏感数据的数字堡垒。 一、核心加密算法矩阵 hashlib 支持极其广泛且先进的加密标准。 原始明文数据 hashlib 算法引擎 传统算法 (MD5 / SHA-256) 现代算法 (SHA-3 / Keccak) 极致速度 (Blake2b / Blake2s) 密钥派生 (Argon2 / Scrypt)

By Ne0inhk