Java 交换不带临时变量的字符串值

Java 交换不带临时变量的字符串值,java,string,swap,Java,String,Swap,我知道溢出、性能下降等情况,但我需要在没有任何临时变量的情况下交换两个字符串值。我知道缺点是什么,并找到了一些有效的方法,但无法理解其中之一 String a = "abc"; String b = "def"; b = a + (a = b).substring(0, 0); System.out.printf("A: %s, B: %s", a, b); 输出显示交换的清除值。当我看到这似乎与优先级操作有关,但我无法在脑海中理解它。请有人给我解释一下发生了什么事吗?基本上你可以考虑交换

我知道溢出、性能下降等情况,但我需要在没有任何临时变量的情况下交换两个字符串值。我知道缺点是什么,并找到了一些有效的方法,但无法理解其中之一

String a = "abc";
String b = "def";

b = a + (a = b).substring(0, 0);

System.out.printf("A: %s, B: %s", a, b);

输出显示交换的清除值。当我看到这似乎与优先级操作有关,但我无法在脑海中理解它。请有人给我解释一下发生了什么事吗?

基本上你可以考虑交换操作

b = a + (a = b).substring(0, 0);
作为

在第一步中,我只是用变量的值替换变量(除了括号中的
a
,因为这是赋值,而不是读取)

现在
a
等于
“def”
,因此
b
是:

b = "abc" + "def".substring(0, 0);
在这一步中,我用它的值替换了括号。现在很明显:

b = "abc";
因为方法
.substring(0,0)
返回一个空字符串


交换完成了。

事实上,你需要问一下这里发生了什么,意味着你应该认真考虑在代码中使用这样的结构。 因为在Java中,表达式是从左到右求值的(请参见“求值顺序”一节)

这是在
b=a+(a=b)的情况下逐步发生的情况。子字符串(0,0)

  • 用变量的值填充
    变量:

    b=“abc”+(a=b)子串(0,0)

  • 用其值填充b变量:

    b=“abc”+(a=“def”)。子字符串(0,0)

  • 由于字符串连接(
    +
    )的第一个属性已被计算,请计算第二个属性,该属性首先将
    的“def”
    重新指定给
    a

    子字符串(0,0)//现在a=“def”

  • “def”

    b=“abc”+”

  • 连接

    b=“abc”

  • 重新分配给
    b
    现在是b=“abc”(正如我们之前所示,a已重新分配给“def”


假设a和b都是字符串变量:

a = (a+b).Substring((b=a).Length);

你到底想知道什么?不使用任何临时变量是什么意思?你不想看到一个临时变量被使用吗?因为我确信总会有一个临时变量隐式地存储在某个地方。@skiwi它当然是隐式的。At在处理不可变对象时。那可能甚至不是这样效率,因为正在创建的唯一临时字符串的长度为零。(我假设追加零长度字符串只返回输入)。“假设追加零长度字符串只返回输入”.好的,可能不会,因为这个过程似乎需要一个StringBuilder,它必须复制周围的东西。好吧,这就是我想要的答案。谢谢@Entech的解释。我知道这个代码不是通常的编码风格,这不是一个好的做法,但面试官有时会要求这样的东西。
a = (a+b).Substring((b=a).Length);