string 、 stringbuffer以及 stringbuilder的区别

String:字符串常量

StringBuffer:字符变量

StringBuilder:字符变量


1.可变与不可变

     String类中使用字符数组保存字符串,

     private final char value[];

   所以String在修改时不会改变对象自身

在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String 。

  StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串

  char[] value;

StringBuffer在修改时会改变对象自身
每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。

2.是否多线程安全

String中的对象是不可变的,也就可以理解为常量,显然线程安全

AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看下面源代码:

 @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

StringBuilder并没有对方法进行加同步锁,所以是非线程安全的

3.执行效率

package cn.itcast.shop.test;

public class Test {
    public void testString() {
        long start = System.currentTimeMillis();
        String str = null;
        for (int i = 0; i < 10000; i++) {
            str = str + i + ",";
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    public void testStringBuffer() {
        long start = System.currentTimeMillis();

        StringBuffer sbuf = new StringBuffer();
        for (int i = 0; i < 10000; i++) {
            sbuf.append(i + ",");
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    public void testStringBulider() {
        long start = System.currentTimeMillis();

        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            builder.append(i + ",");
        }
        System.out.println(System.currentTimeMillis() - start);
    }
    
    public static void main(String[] args){
        Test t1=new Test();
        t1.testString();
        t1.testStringBuffer();
        t1.testStringBulider();
    }
    
    
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------执行结果:519

                     7

                    6


从上执行效率上来看:StringBuilder>StringBuffer>String,所以,如果这是考虑单线程程序的话,用StringBuilder,如果涉及到多线程的,那只能是StringBuffer。



4.StringBuilder与StringBuffer共同点

StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。

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


5.对于三者使用的总结: 1.如果要操作少量的数据用 = String

               2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

                3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值