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