据我所知,当我执行stringbaz=“foo”“bar”“123”
时,Java编译器会在内部用StringBuilder
替换表达式。然而,我们的Java老师告诉我们,总是显式地使用StringBuilder
是一个很好的实践。。。
我的假设正确吗?我只需要在串联内部循环时显式使用StringBuilder,如堆栈溢出问题的答案“String builder vs String concatenation”中所示?在其他情况下,是否应该明确使用StringBuilder
而不是或
=
?
它们还适用于用字符串实现C#的'out'关键字。实例
public int getInt(StringBuilder error)
{
int retVal = 0;
if (someErrorOccured)
error.append("Couldn't get int because of...");
else
retVal = whatItsSupposedToBe;
return retVal;
}
欧比万说过,只有西斯认为绝对或类似的东西...
很好,您知道Java编译器使用StringBuilder
在内部替换字符串上的“”。这就是编译器的作用:使生活更轻松。
除非你有循环,比如在链接的情况下,或者Jon Skeet例子中的条件句,这主要是可读性和易于维护的问题。
替换
return "User " + userName + " said";
与
new StringBuilder().append("User ").append(userName).append(" said").toString();
使代码更长,可能更难修改,更有可能强制换行,并提供更多性能。
但是,当加法不仅适用于字符串,而且还涉及数字时,使用StringBuilder
的解决方案有时可能更具可读性。
return "User" + a + b + " said: " + (c + d);
可能更令人困惑的是:
return new StringBuilder().append("User ").append(a).append(b)
.append(" said: ").append(c+d).toString();
但这主要是观点和编码风格的问题。“应该”在这里不是一个好词。
它比“内部循环”更为通用——可以在任何时候对多个语句进行串联,而不需要中间结果作为字符串。例如:
StringBuilder builder = new StringBuilder("Start");
if (someCondition) {
builder.append("Foo");
}
if (someOtherCondition) {
builder.append("Bar");
}
builder.append("End");
String result = builder.toString();
你可以写成:
String result = "Start" + (someCondition ? "Foo" : "")
+ (someOtherCondition ? "Bar" : "") + "End";
... 这变得很难理解。如果if
主体中有更多的语句,那么它甚至可能不可行。
要更正问题中的某些内容,请执行以下操作:
据我所知,当我执行String baz=“foo”bar“123”时,java编译器会在内部用StringBuilder替换表达式。
不,当您编写表达式时,编译器会识别它是一个编译时常量,并将其替换为
String baz = "foobar123";
这是一个非常好的理由,不要显式地使用StringBuilder
-上面的代码在执行时显然比
String baz = new StringBuilder("foo").append("bar").append("123").toString();
当它不是编译时常量时,Java编译器将使用StringBuilder
执行串联,通常会给您留下比显式使用StringBuilder
更容易理解的代码,但没有性能影响。我怀疑你的老师要么没有正确理解字符串串联,要么只是在其他地方阅读你应该使用的StringBuilder
,而没有完全理解什么时候是合适的。
问题内容: StringBuilder在Java中,通常最好使用a 进行字符串连接。总是这样吗? 我的意思是:创建对象,调用方法并最终已经很小,然后将现有字符串与+运算符连接成两个字符串的开销是小的,还是建议仅用于两个以上的字符串? 如果有这样的阈值,它取决于什么(也许是字符串长度,但以哪种方式)? 最后,你是否会以+级联的可读性和简洁性为代价,以较小的情况(例如两个,三个或四个字符串)的性能为代
有人在指令中被监视。 在这种情况下,只有在apply存在时才触发watch。
问题内容: 我试图显式地使用LambdaMetafactory.metafactory,我不明白为什么它只能与Runnable功能接口一起使用。例如,以下代码完成了预期的工作(打印“ hello world”): 当我尝试使用其他功能接口(例如供应商)时,就会出现问题。以下代码不起作用: 这两个代码段不应该以相似的方式工作吗,这是第二个代码段中的问题? 此外,以下应等效的代码也可以正常工作: 编辑
问题内容: 我刚刚在我的项目中发现了一些这样的sql查询构建: 这是否达到其目标,即减少内存使用量? 我对此表示怀疑,因为在构造函数中使用了“ +”(字符串concat运算符)。像下面的代码那样,将占用与使用String相同的内存量吗?我了解,使用时有所不同。 两条语句的内存使用量是否相等?请澄清。 提前致谢! 编辑: 顺便说一句, 这不是我的代码 。在一个旧项目中发现它。而且,查询的大小不如我的
在下面的代码中。我在Intellij idea编译器中发现val a和val b默认为"val a: StringBuilder" 这两者的区别是什么?和
我是Spring的新手。在@Bean方法中注入Bean的这两种方法有什么区别?我应该使用哪个,为什么? 而且