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

时间:2014-05-30 09:16:26

标签: java string swap

我知道溢出,性能下降等,但我需要交换两个String值而不需要任何临时变量。我知道什么是缺点,并找到了一些有效的方法,但无法理解其中一个。

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

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

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

输出显示交换明确的值。当我看到这似乎与优先操作有关但我无法在脑海中弄明白。拜托,有人可以向我解释会发生什么吗?

3 个答案:

答案 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