String拼接字符串

来源:互联网 发布:hash 源码 编辑:程序博客网 时间:2024/04/29 10:03

方法1:builder是最后会被释放掉。

private void actionA() {StringBuilder builder = new StringBuilder("0");long start = System.currentTimeMillis();for(int i = 1; i <= 1000 * 100; i++) {builder.append(i);}long end = System.currentTimeMillis();System.out.println("actionA耗时:" + (end - start));}


方法2:+产生大量的String 临时类,增加了对垃圾回收占用CPU的时间。

private void actionB() {String str = "0";long start = System.currentTimeMillis();for(int i = 1; i <= 1000 * 100; i++) {str = str + i;}long end = System.currentTimeMillis();System.out.println("actionB耗时:" + (end - start));}

输出结果:值不是绝对的,但方法2确实比方法1快很多。

actionA耗时:13

actionB耗时:34960


还有一个StringBuffer,有个线程安全问题:多个线程修改同一个对象时可能产生的冲突情况。比如一个 StringBuilder ,可能被多个线程访问,那么如果没有 synchronized 的话,第一个线程改变了其值,之后又有第二个线程改变了它的值。当切换回第一个线程时,读到的就是第二个线程修改后的值了。如果不考虑多线程, StringBuilder 比StringBuffer要快。


String:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。

StringBuffer:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中。

StringBuilder:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中。