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

use*_*029 19 java string swap

如何在不使用第三个变量(即temp变量)的情况下在Java中交换两个字符串变量?

String a = "one"
String b = "two"
String temp = null;
temp = a;
a = b;
b = temp;
Run Code Online (Sandbox Code Playgroud)

但这里有第三个变量.我们需要消除第三个变量的使用.

Ank*_*thi 34

不使用第三个变量就这样做:

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

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

System.out.println("a = " + a);
System.out.println("b = " + b);
Run Code Online (Sandbox Code Playgroud)

  • a + b将创建第三个字符串对象(字符串是不可变的) - 最好使用临时引用 - 至少你不是在创建对象. (2认同)

mar*_*cus 12

//取自这个答案:https://stackoverflow.com/a/16826296/427413

String returnFirst(String x, String y) {
    return x;
}

String a = "one"
String b = "two"
a = returnFirst(b, b = a); // If this is confusing try reading as a=b; b=a;
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为Java语言保证(Java语言规范,Java SE 7版,第15.12.4.2节)所有参数都是从左到右进行评估(不同于其他语言,其中评估的顺序是未定义的),因此执行顺序是:

  1. 计算原始值,b以便作为函数的第一个参数传递
  2. 计算表达式b = a,并将结果(新值b)作为函数的第二个参数传递
  3. 该函数执行,返回原始值b并忽略其新值
  4. 你把结果归结为 a
  5. 现在值已被交换,您不需要声明temp.该参数x可以工作temp,但它看起来更干净,因为您定义了一次该函数,您可以在任何地方使用它.


Hus*_*man 6

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

a = a.concat("#" + b);
b = a.split("#")[0];
a = a.split("#")[1];
Run Code Online (Sandbox Code Playgroud)

只要您的字符串中不包含#字符,这将起作用.随意使用任何其他角色.

您可以使用可能的Unicode字符,例如"\ u001E"而不是#.


com*_*mit 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);
Run Code Online (Sandbox Code Playgroud)

将任何值作为变量中的字符串。将会是交换。