我有以下程序,我必须将字符串附加到另一个字符串,我使用字符串构建器以标准方式执行。但是,即使我将ab
转换为toString()
,该函数也不允许我返回 import java.util.*;
public class prog1 {
public static String k(int i) {
String a = "1";
StringBuilder ab = new StringBuilder();
int pos = 1;
if (i == 1) {
return a;
}
else{
pos++;
String first = Integer.toString(pos);
ab.append(a).insert(0,first);
ab.toString();
return ab;
}
}
public static void main (String[]args){
k(2);
}
}
。我想问为什么?
takeUntil
答案 0 :(得分:5)
您不会返回String
返回的StringBuilder.toString()
:
ab.toString();
return ab;
要获取ab.toString();
返回的结果,您必须将其分配给变量。然后你可以退货:
String s = ab.toString();
return s;
或者在您的情况下,您可以直接返回结果,因为您不需要操作/转换返回的字符串:
return ab.toString();
答案 1 :(得分:2)
ab.toString();
return ab;
toString()
方法无法将StringBuilder
神奇地转换为String
。
它返回String
表示(您不使用)。
将其更改为:
return ab.toString();
答案 2 :(得分:0)
你应该
return ab.toString();
而不是
return ab;
即使我将它转换为toString()
,该函数也不允许我返回ab
致电ab.toString()
不会将ab
从StringBuilder
转换为String
。它返回一个新的String
实例,您没有将该实例分配给任何变量,因此无法返回。
答案 3 :(得分:0)
toString()方法返回 StringBuilder中包含的String。 它不会修改它的内容。
return ab.toString();
解决问题。
答案 4 :(得分:0)
首先,您的代码将无法编译。因为在else bock中你返回了一个StringBuilder而不是String。现在,尝试了解这些值将如何存储在内存中,然后您将找到问题所在。
每当我们初始化变量时,都会在内存中创建一个新的引用。如果我们想对任何引用操作任何String操作,那么将复制该引用的值,并在内存中创建一个新引用,然后String将发生该操作。
public class Test {
public static String k(int i) {
String ab = "ab "; // ----------------------------------------------- 1
StringBuilder stringBuilder = new StringBuilder("stringBuilder "); // -- 2
String c = ab.concat("c "); // ----------------------------------------- 3
ab.concat(stringBuilder.toString()); // -------------------------------- 4
String d = ab.concat(stringBuilder.toString()); // -------------------- 5
System.out.println("c : "+c);
System.out.println("d : "+d);
System.out.println("ab : "+ab);
return ab;
}
public static void main(String[] args) {
k(2);
}
}
输出:
c : ab c
d : ab stringBuilder
ab : ab
在此示例中,
由于这些原因,引用ab的值将与初始化相同,因为每次创建新引用时都会执行String操作。
但是在StringBuilder的情况下,所有操作都将在同一个引用中发生。将不会创建另一个参考。
在您的代码中,您可以通过将ab.toString()
值存储在新引用中并返回该值来解决问题。另一种方法是return ab.toString()