String字符串是Java中最常用的数据结构.
"+"在Java中已被String类重载.所以我们常见是用"+"来连接字符串.
如:
在JDK5.0以后还提供一个类StringBuilder(JDK1.4中只提供了StringBuffer),它也可以提供类似"+"的功能.
[StringBuilder和StringBuffer的区别是前者是线程不安全的,后者是线程安全的,所以从效率上来说前者要比后者高]
StringBuilder一般使用在方法内部来完成类似"+"功能,因为是线程不安全的,所以用完以后可以丢弃.StringBuffer要用在全局变量中,
上面我们讨论了两者的区别.下面我们来比较StringBuilder和"+"的效率区别...
如果一个简单的字符串的拼接,应该说StringBuilder和"+"的效率是差不多的,因为在JVM编译过程中,它首先就是将"+"编译成StringBuilder的引用来append.
编译完后我们用Jad反编译/.class后我们可以看到所有的"+"号全被StringBuilder代替.
所以我们说在这种情况下使用"+"和使用StringBuiler效率差不多.我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder。
但在for循环中我们再来测试一下二者的效率.
此时我们会看到如下的情形:
虽然编译器将"+"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环,就会创建一个StringBuilder对象(对于本例来说,是创建了10个StringBuilder对象),虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。解决这个问题的方法就是在程序中直接使用StringBuilder来连接字符串,代码如下:
此外在循环中也不要和StringBuiler混用"+"号;以上代码在JDK5.0下测试通过.如果是JDK1.4,则将StringBuilder替换为StringBuffer().
总结:
如果在循环中尽量少用new对象来创建对象,这样会导致大量对象的创建,类似的地方还有:
伪代码
"+"在Java中已被String类重载.所以我们常见是用"+"来连接字符串.
如:
String test = " the first number is " + 0;
在JDK5.0以后还提供一个类StringBuilder(JDK1.4中只提供了StringBuffer),它也可以提供类似"+"的功能.
[StringBuilder和StringBuffer的区别是前者是线程不安全的,后者是线程安全的,所以从效率上来说前者要比后者高]
StringBuilder一般使用在方法内部来完成类似"+"功能,因为是线程不安全的,所以用完以后可以丢弃.StringBuffer要用在全局变量中,
上面我们讨论了两者的区别.下面我们来比较StringBuilder和"+"的效率区别...
如果一个简单的字符串的拼接,应该说StringBuilder和"+"的效率是差不多的,因为在JVM编译过程中,它首先就是将"+"编译成StringBuilder的引用来append.
public static void main(String[] args){
String result = " hello" + "javaeye"+" " + 1234567890;
System.out.println(result);
}
编译完后我们用Jad反编译/.class后我们可以看到所有的"+"号全被StringBuilder代替.
String result = (new StringBuiler("hello")).append("javaeye").append(" ").append(1234567890).toString();
所以我们说在这种情况下使用"+"和使用StringBuiler效率差不多.我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder。
但在for循环中我们再来测试一下二者的效率.
String result = "";
Random r = new Random();
for(int i=0; i< 10;i++){
result = result + r.nextInt(1000)+ "";
}
System.out.println(result);
此时我们会看到如下的情形:
result = (new StringBuiler(String.valueOf(result))).append(r.nextInt(1000)).append(" ").toString();
虽然编译器将"+"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环,就会创建一个StringBuilder对象(对于本例来说,是创建了10个StringBuilder对象),虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。解决这个问题的方法就是在程序中直接使用StringBuilder来连接字符串,代码如下:
String result = "";
Random r = new Random();
StringBuilder sb = new StringBuilder();
for(int i=0; i<10 ; i++){
sb.append(r.nextInt(1000));
sb.append("");
}
result = sb.toString();
System.out.println(result);
此外在循环中也不要和StringBuiler混用"+"号;以上代码在JDK5.0下测试通过.如果是JDK1.4,则将StringBuilder替换为StringBuffer().
总结:
如果在循环中尽量少用new对象来创建对象,这样会导致大量对象的创建,类似的地方还有:
伪代码
int length = xxxList.size();
for(int i=0;i<length;i++}{......}
//和将得到length放到循环里取的性能就不一样
for(int i=0;i<xxxList.size();i++){......}