从Java中的String函数返回String构建器?

时间:2018-02-22 08:26:36

标签: java string function stringbuilder

我有以下程序,我必须将字符串附加到另一个字符串,我使用字符串构建器以标准方式执行。但是,即使我将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

5 个答案:

答案 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()不会将abStringBuilder转换为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

enter image description here

在此示例中,

  1. 第1行,将创建一个String引用及其值 引用是ab(类型字符串)。
    1. 第2行,将创建一个StringBuffer引用,该引用的值为buffer(类型为StringBuffer)。
    2. 第3行,将创建一个String引用,该引用的值为ab c(String类型)。 ab引用的值将被复制并与String c连接。值将存储在c。
    3. 中的新String引用中
    4. 第4行,将创建一个String引用,该引用的值为ab buffer(类型为String)。 ab引用的值将被复制并连接,引用stringBuffer。但为此,不会创建任何参考。
    5. 第5行,将创建一个String引用,该引用的值为ab buffer(类型为String)。 ab引用的值将被复制并连接,引用stringBuffer。该值将存储在d。
    6. 中的新String引用中
  2. 由于这些原因,引用ab的值将与初始化相同,因为每次创建新引用时都会执行String操作。

    但是在StringBuilder的情况下,所有操作都将在同一个引用中发生。将不会创建另一个参考。

    在您的代码中,您可以通过将ab.toString()值存储在新引用中并返回该值来解决问题。另一种方法是return ab.toString()