杰瑞科技汇

Java中String为何不能直接交换?

在 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

说明:
这种方式只是交换了变量 str1str2 的引用,并未修改 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)。

分享:
扫描分享到社交APP
上一篇
下一篇