![](/img/trans.png)
[英]Java: StringBuilder, static method and possible synchronization issues
[英]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
指針將改變hello
到good
和hello
的記憶仍然存在,但它是可訪問的,因為沒有一個指向它。
二:
而是使用“字符串生成器”修改舊字符串並將其更改為新字符串,這樣它將占用更少的內存。 當您要修改字符串時,這非常有用。
我想看看這個也會對您有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.