对于小案例,String Builder或“”+ someNumb更有效/更正确吗?

时间:2014-02-04 15:19:31

标签: java android

我一直习惯做:

int num = 12;
String text = ""+12;

很长一段时间,但我发现这是一个非常低效的机制,适用于大量的添加。

对于这些情况,我通常会这样做:

// this is psuedo code here..
FileInputStream fis = new FileInputStream(fis);
StringBuilder builder = new StringBuilder();
while(input.hasNext()) {
   builder.append(input.nextString());
}

我的问题是:编码Android时(与通用Java案例相比)是否在使用String Builder的小案例中进行性能折衷,或者在这些小案例中是否有其他理由更喜欢String Builder?在上面提到的简单案例中,似乎有很多额外的输入。我也怀疑(虽然我还没有确认)在简单情况下的内存分配可能不值得。

编辑:假设在编译时不知道附加的值,I.E。它们不是常数。

上面“+12”的例子也是一个选择不当的例子。假设它是

String userGeneratedText  = textInput.getText().toString();
int someVal = intInput.getInt();

String finalVal = userGeneratedText+someVal;

2 个答案:

答案 0 :(得分:4)

如果您的代码简短,如下所示:

String text = "foo" + 12;

编译器会自动替换串联以使用StringBuilder

String text = new StringBuilder().append("foo").append(12).toString();

所以不要担心这段代码的效率低下,因为它会比你期望的更好。

如果您需要追加非常大的String或者您不知道将连接多少个对象(字符串,整数,布尔值等),请使用StringBuilder在你的第二个代码示例中。

以下是有关字符串连接如何工作的更深入的解释:http://blog.eyallupu.com/2010/09/under-hood-of-java-strings.html

答案 1 :(得分:-1)

据我所知! string 是不可变对象。这意味着它的状态无法更改,当您将值附加到字符串类型时,发生的事情是编译器删除旧的创建一个具有附加值的新值。

StringBuilder 的情况并非如此。 StringBuilder 是可变的,这意味着它的旧值不会被销毁。任何更改/追加都将使用现有对象进行。

我知道我没有深入讨论,但这可能会导致重大的性能差异。