String、StringBuffer和StringBuilder区别

来源:互联网 发布:微信授权登陆api java 编辑:程序博客网 时间:2024/05/29 13:24

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");

输出:

string = abcdefdef……

runningTime = 42947ms


StringBuffer:

使用StringBuffer输出:

string = abcdefdef……

runningTime = 9ms


StringBuilder:

使用StringBuilder输出:

string = abcdefdef……

runningTime = 8ms


2.速度差异的原因

String:字符串常量

StringBuffer:字符串变量

StringBuilder:字符串变量


可以看出,String类型是常量,是不能改变的。但是我们平时使用的时候,明明是改变了:

        String test = "abc";        test = test + "def";        System.out.println(test);

其实:当test执行操作时,重新在内存开辟了一个空间来存储 "abcdef” ,换句话说,重新创建了一个叫test的变量,而原来test会被GC回收掉。而创建新的String变量是非常耗时的。

而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关键字,进行同步。

抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。



对知识做以总结,希望不吝赐教







0 0
原创粉丝点击