我一直习惯做:
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;
答案 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 是可变的,这意味着它的旧值不会被销毁。任何更改/追加都将使用现有对象进行。
我知道我没有深入讨论,但这可能会导致重大的性能差异。