【问题标题】:Returning String builder from a String function in Java?从Java中的字符串函数返回字符串生成器?
【发布时间】:2018-02-22 08:26:36
【问题描述】:

我有以下程序,我必须将字符串附加到另一个字符串,并且我使用字符串生成器以标准方式执行此操作。但是,即使我已将其转换为 toString(),该函数也不允许我返回 ab。我想问这是为什么?

 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);
            }
        }

【问题讨论】:

  • 因为您还没有将StringBuilder转换String,所以这无法完成。此外,您的代码对于编写return i == 1 ? "1" : "21"; 来说还有很长的路要走。

标签: java string function stringbuilder


【解决方案1】:

你不返回StringBuilder.toString()返回的String

ab.toString();
return ab;

要获得ab.toString(); 返回的结果,您必须将其分配给一个变量。然后你就可以退货了:

String s = ab.toString();
return s;

或者在您的情况下,您可以直接返回结果,因为您不需要操作/转换返回的字符串:

return ab.toString();       

【讨论】:

    【解决方案2】:
    ab.toString();
    return ab;
    

    toString() 方法不会神奇地将您的StringBuilder 转换为String。 它返回一个String 表示(你不使用它)。

    改成:

    return ab.toString();
    

    【讨论】:

      【解决方案3】:

      你应该

      return ab.toString();
      

      而不是

      return ab;
      

      该函数不允许我返回 ab,即使我已将它转换为 String()

      调用ab.toString() 不会将abStringBuilder 转换为String。它返回一个新的 String 实例,您没有将其分配给任何变量,因此无法返回。

      【讨论】:

        【解决方案4】:

        toString() 方法返回 StringBuilder 中包含的字符串。 它不会修改它的内容。

        return ab.toString();
        

        解决问题。

        【讨论】:

          【解决方案5】:

          首先,您的代码不会编译。因为在 else 块中,您返回了 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
          

          在这个例子中,

          1. 第 1 行,将创建一个字符串引用并为其赋值 参考是 ab(字符串类型)。
            1. 第 2 行,将创建一个 StringBuffer 引用,该引用的值为缓冲区(StringBuffer 类型)。
            2. 第 3 行,将创建一个字符串引用,该引用的值为 ab c(字符串类型)。 ab 引用的值将被复制并与字符串 c 连接。值将存储在 c 中的新字符串引用中。
            3. 第 4 行,将创建一个字符串引用,该引用的值为 ab 缓冲区(字符串类型)。 ab 引用的值将被复制并连接到 stringBuffer 的引用。但为此,不会创建任何引用。
            4. 第 5 行,将创建一个字符串引用,该引用的值为 ab 缓冲区(字符串类型)。 ab 引用的值将被复制并连接到 stringBuffer 的引用。该值将存储在 d 中的新字符串引用中。

          由于这些原因,引用 ab 的值将与初始化相同,因为每次都会创建新的引用并进行字符串操作。

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

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

          【讨论】:

            猜你喜欢
            • 2013-01-03
            • 1970-01-01
            • 1970-01-01
            • 2015-01-13
            • 1970-01-01
            • 2014-01-04
            • 1970-01-01
            • 2010-11-10
            相关资源
            最近更新 更多