簡體   English   中英

從Java中的String函數返回String構建器?

[英]Returning String builder from a String function in Java?

我有以下程序,我必須將字符串附加到另一個字符串,我使用字符串構建器以標准方式執行。 但是,即使在將其轉換為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.toString()返回的String

ab.toString();
return ab;

獲取ab.toString();返回的結果ab.toString(); 你必須將它分配給一個變量。 然后你可以退貨:

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

或者在您的情況下,您可以直接返回結果,因為您不需要操作/轉換返回的String:

return ab.toString();       
ab.toString();
return ab;

toString()方法不會將StringBuilder神奇地轉換為String 它返回一個String表示(您不使用它)。

將其更改為:

return ab.toString();

你應該

return ab.toString();

代替

return ab;

我將函數轉換為toString()后,該函數不允許我返回ab

調用ab.toString()不會將abStringBuilder轉換為String 它返回一個新的String實例,您沒有將該實例分配給任何變量,因此無法返回。

toString()方法確實返回 StringBuilder中包含的String。 它不會修改它的內容。

return ab.toString();

解決問題。

首先,您的代碼將無法編譯。 因為在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

在此輸入圖像描述

在這個例子中,

  1. 第1行,將創建一個String引用,該引用的值為ab(String類型)。
    1. 第2行,將創建一個StringBuffer引用,該引用的值為buffer(類型為StringBuffer)。
    2. 第3行,將創建一個String引用,該引用的值為ab c(String類型)。 ab引用的值將被復制並與String c連接。 值將存儲在c中的新String引用中。
    3. 第4行,將創建一個String引用,該引用的值為ab buffer(類型為String)。 ab引用的值將被復制並連接,引用stringBuffer。 但為此,不會創建任何引用。
    4. 第5行,將創建一個String引用,該引用的值為ab buffer(類型為String)。 ab引用的值將被復制並連接,引用stringBuffer。 該值將存儲在d中的新String引用中。

由於這些原因,引用ab的值將與初始化相同,因為每次創建新引用時都將執行它的String操作。

但是在StringBuilder的情況下,所有操作都將在同一個引用中發生。 將不會創建另一個參考。

在您的代碼中,您可以通過將ab.toString()值存儲在新引用中並返回該值來解決問題。 另一種方法是return ab.toString()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM