JAVA基础篇-String&StringBuilder&StringBuffer的区别

特性比较

1.String是不可变的,StringBuilder/Buffer是可变的。
2.String提供"+"号重载符或者 concat(String str)方法去追加字符串,StringBuilder和StringBuffer提供append(CharSequence
chseq)方法追加字符串,StringBuilder用到了建造者设计模式,每次append之后返回的是对象本身,而String的concat追加方法返回的是一个新的对象,"+"号同理。
3.StringBuilder与StringBuilder的区别是一个是线程不安全的,一个是线程安全的,其他都是一样的。
4.StringBuilder提供了指定位置的增加删除修改字符串的方法.而String是不可更改的,一旦初始化就不能做修改动作了。

通过代码测试看出来的性能差异:


    public static void main(String[] args)  {


        String stringAppend="";

        long start0= System.currentTimeMillis();
        for(int i=1;i<=100000;i++){
            stringAppend+=i;
        }

        long end0= System.currentTimeMillis();

        System.out.println("用String +号追加10000个字符串一共花费了:["+(end0-start0)+"]");



        long start= System.currentTimeMillis();

        for(int i=1;i<=100000;i++){
            stringAppend.concat(i+"");
        }

        long end= System.currentTimeMillis();


        System.out.println("用String concat号追加100000个字符一共花费了:["+(end-start)+"]");



        StringBuilder StringBuilder=new StringBuilder();

        long start1= System.currentTimeMillis();
        for(int i=1;i<=100000;i++){
            StringBuilder.append("a");
        }

        long end1= System.currentTimeMillis();

        System.out.println("用StringBuilder append()追加10000个字符串一共花费了:["+(end1-start1)+"]");

    }

性能测试结果:


JAVA基础篇-String&StringBuilder&StringBuffer的区别_第1张图片
image.png

从上图可以看出他们之间的差异是非常明显的。
最慢的是"+"号,最快的是append添加器。

在分析StringBuilder和StringBuffer之前我们先来查看一下这三个类的类图。


JAVA基础篇-String&StringBuilder&StringBuffer的区别_第2张图片
1560404326(1).jpg
JAVA基础篇-String&StringBuilder&StringBuffer的区别_第3张图片
1560404142(1).jpg
JAVA基础篇-String&StringBuilder&StringBuffer的区别_第4张图片
1560404142(1).jpg

从类图构造上我们不难看出这个三个类都实现了CharSequence接口,这个接口里面提供了读取char[]数据的一些属性,如获取长度,某个位置的字符等等。

JAVA基础篇-String&StringBuilder&StringBuffer的区别_第5张图片
image.png

StringBuilder和StringBuffer同时也都实现了字符串追加器接口Appendable。接口里面提供了三个重载方法,添加CharSequnce


JAVA基础篇-String&StringBuilder&StringBuffer的区别_第6张图片
image.png

Append()追加方法在AbstractStringBuilder里面实现了。


JAVA基础篇-String&StringBuilder&StringBuffer的区别_第7张图片
image.png

StringBuilder与StringBuffer是可变的字符串追加器,StringBuffer是线程安全的,通过查看JDK源代码对比得出:与StringBuilder不同的地方是除了构造函数之外,部分方法都加了方法级别的同步锁(synchronized)块,他们之间还有个细微差别是,当且仅当toString()时StringBuffer里面有cache char数组的操作。


JAVA基础篇-String&StringBuilder&StringBuffer的区别_第8张图片
image.png

...相比StringBuffer还有个细微的差别是,当转换为String时他会cache当前的String,下次使用时如果构造器里面的字符串没有发生任何变化就可以直接拿cache,从而提高效率。


JAVA基础篇-String&StringBuilder&StringBuffer的区别_第9张图片
image.png

还有很多区别,欢迎拍砖。

你可能感兴趣的:(JAVA基础篇-String&StringBuilder&StringBuffer的区别)