小编典典

通过将两个字符串传递给实用函数来交换Java中的两个字符串,但不返回对象或使用包装器类

java

我正在尝试在Java中交换两个字符串。我从未真正理解过“字符串是不可变的”。我从理论上了解它,但在实践中从未见过。

另外,由于String是Java中的对象,而不是原始类型,所以我不明白为什么下面的代码两次打印相同的结果,而不是交换单词!

public static void main(String[] args)
{
    String s1 = "Hello";
    String s2 = "World";

    System.out.println(s1 + " " + s2);

    Swap(s1, s2);

    System.out.println(s1 + " " + s2);
}

public static void Swap(String s1, String s2)
{
    String temp = s1;
    s1 = s2;
    s2 = temp;
}

我要打印

Hello World
World Hello

但这是印刷

Hello World
Hello World

我认为s1和s2是引用,因此应该交换引用,而新引用应分别指向另一个引用。我要去哪里错了?


阅读 213

收藏
2020-11-01

共1个答案

小编典典

我认为s1和s2是引用,因此应该交换引用,而新引用应分别指向另一个引用。

是。在本地 内部 swap,这正是发生的情况。

但是,s1s2是传递给函数的引用的 副本 ,因此效果保持局部性。请注意,不是复制的字符串(因为String是引用类型)。但是引用
复制了。

…并且由于参数引用 始终 是用Java复制的,swap因此根据您的规范编写函数非常简单。

如果您在理解区别上有困难,请考虑以下问题:您想给朋友写一封信,以便将其通讯地址从通讯录复制到信封上。通过此过程,您当然不会复制她的房屋(实际上复制整个房子有点困难)–您只复制了地址。

好吧,一个地址 指的 是她的家,所以它就像一个Java参考。

2020-11-01