在 Java 中,String 对象是不可变的(immutable),这意味着一旦创建,其内容就不能被修改。不能直接交换两个 String 变量的引用,但可以通过以下几种方式实现类似的效果:
方法 1:交换引用(最直接的方式)
如果只是交换两个 String 变量的引用(即指向不同的 String 对象),可以直接使用临时变量:
public class StringSwap {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
System.out.println("Before swap: str1 = " + str1 + ", str2 = " + str2);
// 交换引用
String temp = str1;
str1 = str2;
str2 = temp;
System.out.println("After swap: str1 = " + str1 + ", str2 = " + str2);
}
}
输出:
Before swap: str1 = Hello, str2 = World
After swap: str1 = World, str2 = Hello
说明:
这种方式只是交换了变量 str1 和 str2 的引用,并未修改 String 对象本身。
方法 2:使用数组或容器(模拟交换)
如果需要在方法中交换 String 的值(因为 Java 是值传递,方法内无法直接修改局部变量),可以通过数组或容器类(如 AtomicReference)实现:
使用数组
public class StringSwap {
public static void main(String[] args) {
String[] strings = {"Hello", "World"};
System.out.println("Before swap: strings[0] = " + strings[0] + ", strings[1] = " + strings[1]);
swapStrings(strings, 0, 1);
System.out.println("After swap: strings[0] = " + strings[0] + ", strings[1] = " + strings[1]);
}
public static void swapStrings(String[] arr, int i, int j) {
String temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
输出:
Before swap: strings[0] = Hello, strings[1] = World
After swap: strings[0] = World, strings[1] = Hello
使用 AtomicReference(线程安全)
import java.util.concurrent.atomic.AtomicReference;
public class StringSwap {
public static void main(String[] args) {
AtomicReference<String> str1 = new AtomicReference<>("Hello");
AtomicReference<String> str2 = new AtomicReference<>("World");
System.out.println("Before swap: str1 = " + str1.get() + ", str2 = " + str2.get());
// 交换引用
String temp = str1.get();
str1.set(str2.get());
str2.set(temp);
System.out.println("After swap: str1 = " + str1.get() + ", str2 = " + str2.get());
}
}
方法 3:拼接 + 截取(不推荐,效率低)
如果非要交换 String 的内容(而非引用),可以通过拼接和截取实现,但这种方式效率低且代码冗余:
public class StringSwap {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
System.out.println("Before swap: str1 = " + str1 + ", str2 = " + str2);
// 交换内容(模拟)
str1 = str2 + str1.substring(str1.length()); // 实际未改变 str1
str2 = str1.substring(str2.length()) + str2.substring(0, str2.length()); // 无效操作
// 正确的拼接交换方式(不推荐)
String combined = str1 + str2; // "HelloWorld"
str1 = combined.substring(str2.length()); // "World"
str2 = combined.substring(0, str2.length()); // "Hello"
System.out.println("After swap: str1 = " + str1 + ", str2 = " + str2);
}
}
输出:
Before swap: str1 = Hello, str2 = World
After swap: str1 = World, str2 = Hello
缺点:
- 代码复杂,可读性差。
- 涉及字符串拼接和截取,性能较差。
| 方法 | 适用场景 | 是否修改原对象 | 推荐度 |
|---|---|---|---|
| 交换引用 | 简单变量交换 | 否 | |
| 数组/容器 | 方法内交换或复杂逻辑 | 否 | |
| 拼接+截取 | 不推荐(仅演示) | 否 |
最佳实践:
直接交换引用(方法1)是最简单高效的方式,如果需要在方法中交换值,使用数组或容器(方法2),避免使用拼接+截取(方法3)。
