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