String的连接
方法1 使用+=
String s = new String();
for (int i = 0; i < 10000; i++){
s+= "a";
}
方法2 使用带缓冲区的StringBuffer
StringBuffer s = new StringBuffer();
for (int i = 0; i < 10000; i++){
s.append("a")
}
方法1执行时间大概在2000ms左右,方法2却只要10ms左右。
s+= "a" 实际上被转换成了
s = (new StringBuffer()).append(s).append(“a”).toString();
反复多次的创建新对象,自然会消耗更多的时间
注意:像 s = “a” + “b” + “c” 这样的语句,切勿写成 s = “a” ; s += “b”; s += “c”; 不然又要多消耗很多时间。s = “a” +“b” + “c” 本身会被编译为s = _-temp,而__temp = “abc”.
当然,如果因为程序要求s 是由三个变量a,b,c连接而成,那么请使用s = a + b + c 而不是s = a; s += b; s += c;
String的比较
假设有两个字符串a,b,现在需要忽略大小写来比较
方法1
ic_a = a.toUpperCase();
ic_b = b.toUpperCase();
a.equals(b);
方法2
a.equalsIgnoreCase(b);
方法1的执行时间会远远大于方法2
还是这两个字符串a,b,下面给定5种情况
情况1
a = "he" + "llo"
b = "hello"
使用a.equals(b);来比较
情况2
a = "hellO"
b = "hello"
使用a.equals(b);来比较
情况3
a = "hello1"
b = "hello"
使用a.equals(b);来比较
情况4
a = "hellO"
b = "hello"
使用a. equalsIgnoreCase (b);来比较
情况5
a = "hello1"
b = "hello"
使用a. equalsIgnoreCase (b);来比较
执行时间会是 情况4>情况2 >情况3 >情况5 >情况1. 情况1中,由于编译器的优化,a和b实际上指向同一个字符串,比较速度自然快。情况2需要比较到最后一个字符才知道不同,因此时间长。而情况4比较的维度比2更多,因此时间还要长。而情况3,5由于两个字符串的长度不一样,也可以比较快的比较出结果,但是会略慢于情况1。为什么情况5会比情况3快一点呢,是因为equalsIgnoreCase检查长度的步骤比equals中早一点。
JAVA服务器端性能优化----String,码迷,mamicode.com