分别使用使用这三种来拼接字符串,对比各自损耗的时间:
经过测试:
package com.test;public class Main{public static void main(String[] args){testString();testStringBuffer();testStringBuilder();}private static void testStringBuilder() {long begin = System.currentTimeMillis();StringBuilder str = new StringBuilder("");for (int i = 0; i < 30000; i++) {str.append(i);}long end = System.currentTimeMillis();long time = end - begin;System.out.println("-------------StringBuilder性能快--------------");System.out.println(time);}private static void testStringBuffer() {long begin = System.currentTimeMillis();StringBuffer str = new StringBuffer("");for (int i = 0; i < 30000; i++) {str.append(i);}long end = System.currentTimeMillis();long time = end - begin;System.out.println("------------StringBuffer安全的---------------");System.out.println(time);}//String 做做字符串拼接的时候,性能极低,每次拼接的时候对象改变public static void testString(){long begin = System.currentTimeMillis();String str = "";
/* for (int i = 0; i < 30000; i++) {str += i;}*/for(Integer i =0; i< 30000; i++){str += i.toString();}long end = System.currentTimeMillis();long time = end - begin;System.out.println("-----------String----------------");System.out.println(time);}
}
结论:以后拼接字符串,统统使用StringBuffer/StringBuilder,不要使用String。
String和StringBuilder以及StringBuffer的区别:
StringBuffer和StringBuilder都表示可变的字符串,功能方法都是相同的。
唯一的区别(建议使用StringBuilder):
StringBuffer:StringBuffer中的方法都使用synchronized修饰符,表示同步的在多线程并发的时候可以保证线程安全,保证线程安全的时候,性能(速度)较低。
StringBuilder:StringBuilder没有使用synchronized修饰符,不安全,但性能高。
StringBuilder sb = new StringBuilder ()等价于…new StringBuilder(16)(API可见..) 使用StringBUilder无参数的构造器,在底层创建一个长度为16的char数组:
char[] value = new char[16];
此时该数组只能存储16字符,如果超过了,得自动扩容:
自动扩容(创建长度更大得数组,再把之前得数组拷贝到新数组)
此时性能极低,一般得,我们事先知道大概需要存储多少字符,在构造器中就应该设置。
//创建长度为80得字符数组
new StringBuilder(80);
package com.test;public class M1001{public static void main(String[] args) {StringBuilder sb1 = new StringBuilder(16);//链式编程sb1.append("A").append("B");System.out.println(sb1);//之所以可以用链式编程因为返回的是this指针,例如oxx()new M1001().ooxx().ooxx().ooxx();System.out.println("----------删除最后一个字符-----------------");String str ="abcdefg";StringBuffer newString = new StringBuffer(str).deleteCharAt(str.length()-1);System.out.println(newString);System.out.println("--------字符串反转方法-------------------");System.out.println(new StringBuffer("asdf").reverse());}public M1001 ooxx(){return this;}
}