鉴于toString()下面的两个实现,首选哪一个:
public String toString(){
return "{a:"+ a + ", b:" + b + ", c: " + c +"}";
}
Run Code Online (Sandbox Code Playgroud)
要么
public String toString(){
StringBuilder sb = new StringBuilder(100);
return sb.append("{a:").append(a)
.append(", b:").append(b)
.append(", c:").append(c)
.append("}")
.toString();
}
Run Code Online (Sandbox Code Playgroud)
?
更重要的是,鉴于我们只有3个属性,它可能没有什么区别,但你会在什么时候从+concat 切换到 StringBuilder?
通常认为StringBuilder在Java中使用字符串连接通常是优选的.总是这样吗?
我的意思是:创建一个StringBuilder对象的开销,调用append()方法,最后toString()已经小了,然后将现有的字符串与+运算符连接两个字符串,或者只建议更多(超过两个)字符串?
如果有这样的阈值,它依赖于什么(可能是字符串长度,但以哪种方式)?
最后,您是否会交换+串联的可读性和简洁性,以便StringBuilder在较小的情况下(如两个,三个或四个字符串)的性能?
StringBuilder在过时的Java优化技巧以及Java都市神话中,人们提到明确使用常规连接已经过时了.
为什么在Java中,当String是一个类时,你能用+运算符添加字符串?在String.java代码中我没有找到该运算符的任何实现.这个概念是否违反了面向对象?
Bundle如果你不记得所有键的名称(甚至只能打印键名称会很酷),是否有一种简单的方法可以将a的内容打印到Logcat?
我读过一些关于append()的文章比+快得多,但是原因是什么,为什么我们会使用+ over append()呢?谢谢!
在过去,我一直认为你应该使用StringBuilder和append(String)构建带变量的字符串,而不是string += split[i].在什么情况下这是准确的?我问,因为通常,如果我要写下面的内容:
String[] split = args; // command line arguments or whatever
String myString = "";
for (int i = 0; i < split.length; i++) {
myString += split[i];
}
Run Code Online (Sandbox Code Playgroud)
我的IDE告诉我它应该转换为使用StringBuilder.但是,写这样的东西:
StringBuilder build = new StringBuilder();
build.append("the ").append(build.toString()).append(" is bad").append(randomvar);
build.toString();
Run Code Online (Sandbox Code Playgroud)
当我应该使用String时,IntelliJ实际上使用StringBuilder列为性能问题.它被列为性能问题的事实表明它实际上可能导致问题,而不是仅仅是一点点慢.
我注意到第一个例子是一个循环,第二个例子不是 - 是一个建议用于大量连接的StringBuilder,但是正常连接对于非循环情况更好(这也意味着在循环中运算符+=将被使用,而在外部它可能是一个循环"the " + build.toString() + " is bad" + randomVar- 是+ =问题而不是+?)
我在Java中运行时遇到错误:
// Test.java
public class Test {
public static void main(String [] args) throws IOException {
String a = "123";
a = a + "456";
System.out.println(a);
}
}
Run Code Online (Sandbox Code Playgroud)
通过键入以下命令:
javac Test.java
java Test
Run Code Online (Sandbox Code Playgroud)
它已经报告:
Exception in thread "main" java.lang.NoClassDefFoundError: while resolving class: Test
at java.lang.VMClassLoader.resolveClass(java.lang.Class) (/usr/lib64/libgcj.so.5.0.0)
at java.lang.Class.initializeClass() (/usr/lib64/libgcj.so.5.0.0)
at java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (/usr/lib64/libgcj.so.5.0.0)
at gnu.gcj.runtime.FirstThread.run() (/usr/lib64/libgcj.so.5.0.0)
at _Jv_ThreadRun(java.lang.Thread) (/usr/lib64/libgcj.so.5.0.0)
at _Jv_RunMain(java.lang.Class, byte const, int, byte const, boolean) (/usr/lib64/libgcj.so.5.0.0)
at __gcj_personality_v0 (/home/users/haotianyi/tr/java.version=1.4.2)
at __libc_start_main (/lib64/tls/libc-2.3.4.so)
at _Jv_RegisterClasses (/home/users/haotianyi/tr/java.version=1.4.2)
Caused by: …Run Code Online (Sandbox Code Playgroud)