如何在Java中不使用第三个变量交换两个字符串变量

20

在Java中,如何交换两个字符串变量而不使用第三个变量,即temp变量?

String a = "one"
String b = "two"
String temp = null;
temp = a;
a = b;
b = temp;

但是在这里有第三个变量,我们需要消除第三个变量的使用。


1
你知道变量只是引用,可能会被编译器优化掉吗? - Eran
1
你为什么想要消除第三个变量? - Absurd-Mind
1
使用“特殊”分隔符连接,然后再次拆分。 - Roger
如果你们没有注意到的话,这些变量是字符串。 - Aashray
应该欣赏这个问题,因为它涉及到逻辑。 - commit
显示剩余2条评论
19个回答

0

请看这里。试试这个:

String a = "one";
String b = "two";
//String temp=null;
int i = a.length();
a += b;
b = a.substring(0, i);
a = a.substring(i, a.length());
System.out.println(a + " " + b);

把任何字符串值放入一个变量中,它将被交换。

a+b的连接比明确声明第三个字符串引用要昂贵得多,它只是隐藏了它所做的事情:创建一个新的StringBuilder并从中创建一个新的String。 - blgt
@blgt 即使有成千上万个字符,它也会在毫秒级别内执行,如果您对此代码有更好的想法,请提出建议。 - commit
int i = a.length(),在我看来像是第三个变量的声明,这违背了这个练习的目的。 - Husman
@commit 当然,如果只运行一次且不在资源受限的环境中运行,那么可以。我只是建议原始问题中的代码将比建议的答案使用更少的空间和时间。 而且,我没有更好的解决方案。老实说,我真的不认为这个问题有多大意义。 - blgt
@Husman,那么我们可以根据程序员的需求简单地将“i”替换为“a.length()”,根据我的经验,当您需要多次访问时,调用变量的length方法比存储它更昂贵,因为它将从字符串起始计数器读取并读取到字符串的末尾。尽管如此,我仍然会说相同的话,这取决于程序员。对吧? - commit
显示剩余2条评论

0

假设 b=".*" - user3458

0
String a = "one";//creates "one" object on heap
String b = "two";// creates "two" object on heap
System.out.printf("a is %s , b is %s%n",a,b);
a = "two";// will not create new "two" object & now a is pointing to "two" object
b = "one";// will not create new "one" object & now b is pointing to "one" object
System.out.printf("a is %s , b is %s%n",a,b);

0

0
我想指出一点,以防有人查看此线程。 没有使用第三个变量是无法交换两个字符串的。在Java示例中,由于字符串是不可变的,a = a + b创建了第三个字符串,并未重新分配a。而进行reverseString操作会创建一个新变量,但这次它在堆栈帧上,在程序进入新作用域时。使用异或交换可能有效,但在Java中字符串是不可变的,因此XOR交换也会创建临时变量。因此,实际上,除非语言使您能够重新分配到同一内存空间,否则无法交换字符串而不创建新变量。

0

你也可以使用一个临时变量以不同的方式完成这个操作:

String a = "one"
String b = "two"
String temp = null;

temp=a.concat(b);
b=temp.substring(0,a.length());
a=temp.substring(a.length(),temp.length());

System.out.println("After Swapping A:"+a+"B:"+b);

0

使用多维赋值进行交换:

var a = "one";
var b = "two";
console.log("a =",a);
console.log("b =",b);
a = [b, b = a][0];
console.log("after swap a =",a);
console.log("after swap b =",b);

-1
public class ex{
    public static void main(String[] args){

        String s1="abc";
        String s2="def";

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

        s3=s2.replaceAll(s1,s2=s1);

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

    }
}

-1

对于字符串:

String a = "one"
String b = "two"

a = a + b;
b = a.replace(b, "");
a = a.replace(b, "");

3
如果字符串不同,那很好。但如果它们相同,就会遇到问题。例如,String a = "hello",String b = "ello"。 - Husman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接