Java静态字符串或静态StringBuilder

时间:2015-07-18 19:08:06

标签: java android string stringbuilder

在我的Android项目中,我有一个名为Question的单例类,它将在应用程序运行时90%的时间使用。该类包含两个名为问题和答案的静态String变量,因为使用不同的问题和答案字符串重复调用新实例,因此每次都会创建一个新的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;
    }

}

我应该更喜欢使用哪种内存作为更少的内存?

3 个答案:

答案 0 :(得分:3)

在这两种情况下,您的设计似乎都有点缺陷。您正在使用静态变量并在构造函数中初始化它。这似乎是违反直觉的 - 因为如果您尝试创建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");

答案 1 :(得分:1)

当您需要修改字符序列的内容时,类StringBuilder非常有用。

来自javadoc:

  

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

StringBuilder在字符串之间使用+concat()方法替换串联序列变得非常有用。

如果您需要用另一个字符串替换String的整个内容 StringBuilder不是正确的选择。事实上,我想你会把一个带有新问题的字符串传递给StringBuilder来改变它的内容。如果你这样做,你已经创建了新的String(带有新问题)。

因此在此上下文中使用StringBuilder会添加一些内存使用量和一些cpu计算,而不是删除它。

答案 2 :(得分:1)

首先让我们讨论两件事:
一:为什么将字符串分配给另一个字符串会占用更多内存 第二:StringBuilder如何解决这个问题 一:
当你有一个例如String a的字符串并为其分配一个值时,例如a = "Hello",java将在内存中创建一个新字符串,并且指向它。因此,每次将值更改为a = "good"时,它会在内存中创建另一个字符串,a指针将从hello更改为goodhello仍然存在然而,在记忆中,它是可以访问的,因为没有人指向它 二:
字符串构建器改为修改旧字符串并将其更改为新字符串,因此它将消耗更少的内存。当您想要修改字符串时,这很有用。

我认为看this也会对你有帮助。