【问题标题】:Java Static String or Static StringBuilderJava 静态字符串或静态 StringBuilder
【发布时间】:2015-07-18 19:08:06
【问题描述】:

在我的 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;
    }

}

我应该更喜欢哪个使用尽可能少的内存?

【问题讨论】:

  • 这里不使用 append 时,使用StringBuilder 的目的是什么?我没有在重载for loop 的字符串上看到+=?您的代码不需要StringBuilder

标签: java android string stringbuilder


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    StringBuilder 类在您需要修改字符序列的内容时很有用。

    来自 javadoc:

    StringBuilder 的主要操作是追加和插入 方法

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

    如果您需要将一个字符串的全部内容替换为另一个字符串StringBuilder 不是正确的选择。事实上,我想您会将带有新问题的字符串传递给 StringBuilder 以更改其内容。如果您这样做,您已经创建了新字符串(带有新问题)。

    所以在这种情况下使用 StringBuilder 会增加一些内存使用和一些 cpu 计算,而不是删除它。

    【讨论】:

      【解决方案3】:

      首先让我们讨论两件事:
      一:为什么将一个字符串分配给另一个会消耗更多的内存。
      二:StringBuilder是如何解决这个问题的。
      一:
      当您有一个字符串(例如String a)并为它分配一个值(例如a = "Hello")时,java 将做的是在内存中创建一个新字符串,并将 point 指向它。因此,每次您将值更改为 a = "good" 时,它都会在内存中创建另一个字符串,a 指针将从 hello 更改为 goodhello 仍然存在于内存中,但它是可访问的,因为没有一点点。
      二:
      相反,字符串生成器会修改旧字符串并将其更改为新字符串,以便消耗更少的内存。当您想修改字符串时,它很有用。

      我认为查看this 也会对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2013-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-29
        • 2014-11-21
        • 2017-04-29
        • 1970-01-01
        相关资源
        最近更新 更多