Java赋值运算符 #
一、赋值运算符概述 #
赋值运算符用于给变量赋值。
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 赋值 | a = 5 |
| += | 加后赋值 | a += 5 |
| -= | 减后赋值 | a -= 5 |
| *= | 乘后赋值 | a *= 5 |
| /= | 除后赋值 | a /= 5 |
| %= | 取余后赋值 | a %= 5 |
| &= | 按位与后赋值 | a &= 5 |
| |= | 按位或后赋值 | a |= 5 |
| ^= | 按位异或后赋值 | a ^= 5 |
| <<= | 左移后赋值 | a <<= 2 |
| >>= | 右移后赋值 | a >>= 2 |
| >>>= | 无符号右移后赋值 | a >>>= 2 |
二、基本赋值运算符 #
2.1 简单赋值 #
java
int a = 10;
double b = 3.14;
String s = "Hello";
2.2 连续赋值 #
java
int a, b, c;
a = b = c = 10; // 从右向左赋值
System.out.println(a); // 10
System.out.println(b); // 10
System.out.println(c); // 10
2.3 声明时赋值 #
java
int a = 10, b = 20, c = 30;
String name = "张三", city = "北京";
三、复合赋值运算符 #
3.1 算术复合赋值 #
java
int a = 10;
a += 5; // a = a + 5 = 15
a -= 3; // a = a - 3 = 12
a *= 2; // a = a * 2 = 24
a /= 4; // a = a / 4 = 6
a %= 4; // a = a % 4 = 2
System.out.println(a); // 2
3.2 位运算复合赋值 #
java
int a = 10; // 二进制: 1010
a &= 12; // a = a & 12 = 1010 & 1100 = 1000 = 8
a |= 3; // a = a | 3 = 1000 | 0011 = 1011 = 11
a ^= 6; // a = a ^ 6 = 1011 ^ 0110 = 1101 = 13
a <<= 1; // a = a << 1 = 11010 = 26
a >>= 2; // a = a >> 2 = 110 = 6
System.out.println(a); // 6
四、复合赋值的隐式转换 #
复合赋值运算符会自动进行类型转换。
4.1 普通运算 vs 复合赋值 #
java
byte b = 10;
// 普通运算:需要强制转换
// b = b + 1; // 错误:b + 1 结果是int
// 复合赋值:自动转换
b += 1; // 正确:等价于 b = (byte)(b + 1)
System.out.println(b); // 11
4.2 类型转换示例 #
java
byte b = 100;
b += 50; // 正确:自动转换为byte
System.out.println(b); // -106(溢出)
// 等价于
b = (byte) (b + 50);
4.3 不同类型运算 #
java
int i = 10;
long l = 100L;
// 普通运算
// i = i + l; // 错误:结果是long
// 复合赋值
i += l; // 正确:自动转换为int
System.out.println(i); // 110
五、赋值表达式的值 #
赋值表达式本身有值,值为赋值后的变量值。
5.1 在表达式中使用 #
java
int a, b;
// 赋值表达式的值
a = 10; // 表达式值为10
b = (a = 20); // a = 20, b = 20
System.out.println(a); // 20
System.out.println(b); // 20
5.2 在条件中使用 #
java
String line;
while ((line = readLine()) != null) {
process(line);
}
// 等价于
String line = readLine();
while (line != null) {
process(line);
line = readLine();
}
5.3 链式调用 #
java
StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" ").append("World");
// 追加后返回StringBuilder对象
StringBuilder result = sb.append("!");
六、常见用法 #
6.1 累加器 #
java
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println(sum); // 5050
6.2 计数器 #
java
int count = 0;
for (String item : items) {
if (isValid(item)) {
count += 1;
}
}
6.3 字符串拼接 #
java
String result = "";
for (String item : items) {
result += item + ", ";
}
// 更好的方式:使用StringBuilder
StringBuilder sb = new StringBuilder();
for (String item : items) {
sb.append(item).append(", ");
}
String result = sb.toString();
6.4 位标志操作 #
java
int flags = 0;
// 设置标志
flags |= 0x01; // 设置第0位
flags |= 0x04; // 设置第2位
// 清除标志
flags &= ~0x01; // 清除第0位
// 切换标志
flags ^= 0x02; // 切换第1位
// 检查标志
boolean isSet = (flags & 0x04) != 0;
七、注意事项 #
7.1 避免混淆 #
java
int a = 10;
// 比较
if (a == 10) { } // 正确
// 赋值(常见错误)
// if (a = 10) { } // 编译错误:int不能转为boolean
// 布尔变量
boolean flag = true;
if (flag = false) { } // 编译通过,但逻辑错误
if (flag == false) { } // 正确的比较
if (!flag) { } // 更好的写法
7.2 溢出问题 #
java
byte b = 100;
b += 50; // 溢出,结果是-106
// 安全做法
int i = 100;
i += 50; // 150,安全
7.3 字符串拼接效率 #
java
// 低效
String s = "";
for (int i = 0; i < 1000; i++) {
s += i; // 每次创建新String对象
}
// 高效
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i);
}
String s = sb.toString();
7.4 左值要求 #
java
int a = 10;
// 正确:变量是左值
a = 20;
// 错误:常量不是左值
// 10 = a;
// 错误:表达式不是左值
// (a + 1) = 20;
八、最佳实践 #
8.1 初始化时赋值 #
java
// 推荐:声明时初始化
int count = 0;
String name = "";
List<String> list = new ArrayList<>();
// 不推荐:分开写
int count;
count = 0;
8.2 使用复合赋值 #
java
// 推荐:简洁
total += price;
count++;
// 不推荐:冗长
total = total + price;
count = count + 1;
8.3 注意类型转换 #
java
byte b = 10;
// 明确类型转换
b = (byte) (b + 1);
// 或使用复合赋值
b += 1;
九、总结 #
| 运算符 | 等价形式 | 说明 |
|---|---|---|
| a += b | a = a + b | 加后赋值 |
| a -= b | a = a - b | 减后赋值 |
| a *= b | a = a * b | 乘后赋值 |
| a /= b | a = a / b | 除后赋值 |
| a %= b | a = a % b | 取余后赋值 |
| a &= b | a = a & b | 按位与后赋值 |
| a |= b | a = a | b | 按位或后赋值 |
| a ^= b | a = a ^ b | 按位异或后赋值 |
| a <<= n | a = a << n | 左移后赋值 |
| a >>= n | a = a >> n | 右移后赋值 |
赋值运算符要点:
- 复合赋值自动进行类型转换
- 赋值表达式有返回值
- 注意区分
=和== - 字符串拼接使用StringBuilder
最后更新:2026-03-26