簡體   English   中英

Java靜態字符串或靜態StringBuilder

[英]Java Static String or Static StringBuilder

在我的Android項目中,我有一個名為Question的單例類,該類在應用程序運行時將有90%的時間被使用。 該類包含兩個名為String靜態String變量,因為使用不同的String反復調用新實例以用於Question和Answer,因此每次都會創建一個新的String對象。 我正在考慮將String變量更改為StringBuilder並每次都替換其內容。

這是帶有String變量的代碼:

public class Question {

    private static Question mQuestionClass = null;
    private static String mQuestion = "";
    private static String mAnswer = "";

    private Question() {
    }

    public static Question getQuestionInstance(String question, String answer) {
        if (mQuestionClass == null) {
            mQuestionClass = new Question();
        }
        mQuestion = question;
        mAnswer = answer;
        return mQuestionClass;
    }

}

這是帶有StringBuilder變量的代碼:

public class Questiontwo {

    private static Questiontwo mQ2 = null;
    private static StringBuilder mQ = null;
    private static StringBuilder mA = null;

    private Questiontwo() {
    }

    public static Questiontwo newInstance(String q, String a) {
        if (mQ2 == null) {
            mQ2 = new Questiontwo();
        }

        if (mQ == null) {
            mQ = new StringBuilder(q);
        }
        mQ = mQ.replace(0, mQ.length(), q);

        if (mA == null) {
            mA = new StringBuilder(a);
        }
        mA = mA.replace(0, mA.length(), a);
        return mQ2;
    }

}

我更希望使用哪一個內存越少越好?

在這兩種情況下,您的設計似乎都有缺陷。 您正在使用靜態變量並在構造函數中對其進行初始化。 這似乎違反直覺-因為如果您嘗試創建Question多個實例,則靜態變量的值將由最后創建的實例設置。

我建議只使用一個簡單的類

public class Question {
  private String mQuestion = "";
  private String mAnswer = "";

  public Question(String question, String answer) {
    mQuestion = question;
    mAnswer = answer;
  }
}

只需創建Question實例並像常規Java對象一樣使用它們,而不是使用靜態變量創建單例,並且在此過程中會引入意外的錯誤。 讓Android對不再使用的對象進行垃圾回收。

Question q = new Question("What is capital of India?", "New Delhi");

當您需要修改字符序列的內容時, StringBuilder類非常有用。

從javadoc:

StringBuilder上的主要操作是append和insert方法

StringBuilder對於替換字符串之間使用+concat()方法的一系列連接變得非常有用。

如果您需要用另一個String替換String的全部內容, StringBuilder是不正確的選擇 實際上,我想您將帶有新問題的字符串傳遞給StringBuilder來更改其內容。 如果這樣做,您已經創建了新的String(帶有新問題)。

因此,在這種情況下使用StringBuilder會增加一些內存使用量和一些cpu計算,而不是刪除它們。

首先讓我們討論兩件事:
一個:為什么將一個字符串分配給另一個會消耗更多的內存。
第二:StringBuilder如何解決此問題。
一:
當您有一個字符串(例如String a並為它分配一個值(例如a = "Hello" ,java要做的就是在內存中創建一個新字符串,a會指向它。 所以每次例如值更改為a = "good"它在內存中創建另一個字符串和a指針將改變hellogoodhello的記憶仍然存在,但它是可訪問的,因為沒有一個指向它。
二:
而是使用“字符串生成器”修改舊字符串並將其更改為新字符串,這樣它將占用更少的內存。 當您要修改字符串時,這非常有用。

我想看看這個也會對您有幫助。

暫無
暫無

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

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