我知道溢出,性能下降等,但我需要交换两个String值而不需要任何临时变量。我知道什么是缺点,并找到了一些有效的方法,但无法理解其中一个。
String a = "abc";
String b = "def";
b = a + (a = b).substring(0, 0);
System.out.printf("A: %s, B: %s", a, b);
输出显示交换明确的值。当我看到这似乎与优先操作有关但我无法在脑海中弄明白。拜托,有人可以向我解释会发生什么吗?
答案 0 :(得分:7)
基本上你可以考虑交换操作
b = a + (a = b).substring(0, 0);
作为
b = "abc" + (a = "def").substring(0, 0);
在第一步中,我简单地用变量替换变量(除了括号中的a
,因为这是分配值而不是读取)。
现在a
等于"def"
,因此b
是:
b = "abc" + "def".substring(0, 0);
在这一步中,我用括号替换了括号。现在很明显:
b = "abc";
因为方法.substring(0, 0)
返回一个空字符串。
所以交换完成了。
答案 1 :(得分:0)
你需要问这个问题在这里发生了什么,这意味着你应该认真考虑在你的代码中使用这样的结构。
因为在Java表达式中评估从左到右(参见here - '评估顺序'部分)。
这是b = a + (a = b).substring(0, 0)
使用其值填充a
变量:
b = "abc" + (a = b).substring(0, 0);
使用其值填充b变量:
b = "abc" + (a = "def").substring(0, 0);
由于字符串连接的第一个属性(+
)已经过评估,因此评估第二个属性,首先将"def"
重新分配给a
。
b = "abc" + "def".substring(0, 0); //Now a = "def"
在substring
"def"
b = "abc" + ""
级联
b = "abc"
重新分配到b
,现在b =" abc" (正如我们在重新分配到" def"之前已经显示的那样。
答案 2 :(得分:0)
假设a和b都是字符串变量:
Remove-Item