1.三者在执行速度方面:String < StringBuffer < StringBuilder
String:
输入:
long strTimeBefore = System.currentTimeMillis(); String string = "abc"; for(int i=0;i<100000;i++) { string += "def"; } long strTimeAfter = System.currentTimeMillis(); System.out.println("string = " + string); System.out.println("runningTime = " + (strTimeAfter - strTimeBefore) + "ms");
输出:
StringBuffer:string = abcdefdef……
runningTime = 42947ms
使用StringBuffer输出:
StringBuilder:string = abcdefdef……
runningTime = 9ms
使用StringBuilder输出:
2.速度差异的原因string = abcdefdef……
runningTime = 8ms
可以看出,String类型是常量,是不能改变的。但是我们平时使用的时候,明明是改变了:String:字符串常量
StringBuffer:字符串变量
StringBuilder:字符串变量
其实:当test执行操作时,重新在内存开辟了一个空间来存储 "abcdef” ,换句话说,重新创建了一个叫test的变量,而原来test会被GC回收掉。而创建新的String变量是非常耗时的。String test = "abc"; test = test + "def"; System.out.println(test);
而StringBuffer和StringBuilder就不一样了,它们是字符串变量,当执行更改时,是直接对内存中的当前对象做相应的操作,省去创建过程,肯定就会快很多。
3.StringBuffer和StringBuilder的线程安全问题
可以看出StringBuilder是比StringBuffer快一些的,那这些快出的时间来自哪里呢?
StringBuffer:线程安全的
StringBuilder:线程非安全的
原因:
多线程问题。当多个线程访问StringBuffer时,JVM能保证StringBuffer的操作是安全的;而使用StringBuilder时,JVM并不能保证其安全。
总结:
String:操作少量数据
StringBuffer:多线程环境下,操作大量数据
StringBuilder:单线程环境下,操作大量数据
4.StringBuffer和StringBuilder的共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
对知识做以总结,希望不吝赐教