假设字符串a和b:
a += b
a = a.concat(b)
Run Code Online (Sandbox Code Playgroud)
引擎盖下,它们是一样的吗?
这里以concat反编译为参考.我希望能够反编译+运算符以查看它的作用.
public String concat(String s) {
int i = s.length();
if (i == 0) {
return this;
}
else {
char ac[] = new char[count + i];
getChars(0, count, ac, 0);
s.getChars(0, i, ac, count);
return new String(0, count + i, ac);
}
}
Run Code Online (Sandbox Code Playgroud) 通常认为StringBuilder在Java中使用字符串连接通常是优选的.总是这样吗?
我的意思是:创建一个StringBuilder对象的开销,调用append()方法,最后toString()已经小了,然后将现有的字符串与+运算符连接两个字符串,或者只建议更多(超过两个)字符串?
如果有这样的阈值,它依赖于什么(可能是字符串长度,但以哪种方式)?
最后,您是否会交换+串联的可读性和简洁性,以便StringBuilder在较小的情况下(如两个,三个或四个字符串)的性能?
StringBuilder在过时的Java优化技巧以及Java都市神话中,人们提到明确使用常规连接已经过时了.
我们必须一直为日志输出构建字符串等等.在JDK版本中,我们学会了何时使用StringBuffer(许多追加,线程安全)和StringBuilder(许多追加,非线程安全).
有什么建议使用String.format()?它是否有效,或者我们是否被迫坚持连接性能很重要的单线?
例如丑陋的旧式,
String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";
Run Code Online (Sandbox Code Playgroud)
与整洁的新风格(可能很慢),
String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);
Run Code Online (Sandbox Code Playgroud)
注意:我的具体用例是我的代码中的数百个"单行"日志字符串.它们不涉及循环,所以StringBuilder太重量级了.我String.format()特别感兴趣.
java string performance string-formatting micro-optimization
我有一个 String[]
String[] name = {"amit", "rahul", "surya"};
Run Code Online (Sandbox Code Playgroud)
我想在IN子句中的sql查询中发送名称作为参数,所以我如何转换为格式
'amit','rahul','surya'
Run Code Online (Sandbox Code Playgroud) 在我使用数据库的过程中,我注意到我编写了查询字符串,在这个字符串中,我必须在list/array/collection的where子句中加入一些限制.应该是这样的:
select * from customer
where customer.id in (34, 26, ..., 2);
Run Code Online (Sandbox Code Playgroud)
您可以通过将此问题简化为具有字符串集合的问题并希望仅在一个字符串中创建此字符串的逗号分隔列表来简化此操作.
我到目前为止使用的方法是这样的:
String result = "";
boolean first = true;
for(String string : collectionOfStrings) {
if(first) {
result+=string;
first=false;
} else {
result+=","+string;
}
}
Run Code Online (Sandbox Code Playgroud)
但这是你可以看到非常丑陋的.您无法看到第一眼看到的情况,特别是当构造的字符串(如每个SQL查询)变得复杂时.
你(更)优雅的方式是什么?
我试图了解最佳实践是什么以及为什么连接不同情况下的字符串文字和变量.例如,如果我有这样的代码
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String).append("CCCCCCCCCCC").append(D_String)
.append("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
Run Code Online (Sandbox Code Playgroud)
这是这样做的吗?从这篇文章中,我注意到+Strings 上的运算符创建了一个StringBuilder的新实例,连接了操作数,并返回了一个String转换,这似乎比调用更多的工作.append(); 所以,如果这是真的,那就不可能了.但那怎么样String.concat()?.append()每次串联使用是否合适?或者仅仅是变量,文字可以附加.concat()吗?
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String.concat("CCCCCCCCCCC")).append(D_String
.concat("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.concat("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"));
Run Code Online (Sandbox Code Playgroud)
针对这些情况的最佳实践和表现的一般规则是什么?我的假设是否正确+,它应该真的不被使用?
我试图在Java中连接字符串.为什么这不起作用?
public class StackOverflowTest {
public static void main(String args[]) {
int theNumber = 42;
System.out.println("Your number is " . theNumber . "!");
}
}
Run Code Online (Sandbox Code Playgroud) 在这个答案中,它说(暗示)无论如何都将String连接优化为StringBuilder操作,所以当我编写代码时,是否有任何理由在源代码中编写StringBuilder代码?请注意,我的用例与OP的问题不同,因为我连接/追加数十万行.
为了让自己更清楚:我很清楚每个的差异,只是我不知道是否值得实际编写StringBuilder代码,因为它的可读性较差,而且当它的表兄弟,String类被自动转换为无论如何编译过程.
什么时候我们应该使用+来连接字符串,什么时候首选StringBuilder?何时适合使用concat.
我听说StringBuilder更适合循环中的连接.为什么会这样?
谢谢.
我写了一个Java程序,其中,我需要追加一个字符串
" u13a2"到现有的"u1234 u12de u1386 ... u15a3".
因此,弦逐渐变得越来越长.我发现每次追加所花费的时间也变得越来越长.有什么方法可以在某种程度上改善这一点吗?
我想到的实现包括:
unicodeArray += " "+unicode;
Run Code Online (Sandbox Code Playgroud)
要么
unicodeArray = unicodeArray.concat(" "+unicode);
Run Code Online (Sandbox Code Playgroud)
他们给出了类似的表现 我认为造成这些不良表现的主要原因是特殊类型String.它为每个作业创建一个新对象.如果你也这么认为,这是否意味着我最好使用另一种类型,比如字节数组?