String、StringBuffer、StringBuilde

2018-03-05  本文已影响12人  fantasticMao

[TOC]

1.执行速度的比较

** StringBuilder > StringBuffer > String **
** 原因:**
String的构造方法创建的是一个字符串常量:

/** The value is used for character storage. */
    private final char value[];
    
/**
     * Initializes a newly created {@code String} object so that it represents
     * an empty character sequence.  Note that use of this constructor is
     * unnecessary since Strings are immutable.
     */
    public String() {
        this.value = "".value;
    }

StringBuffer和StringBuilder创建的一个字符串变量:

/**
     * The value is used for character storage.
     */
    char[] value;
    
/**
     * Constructs a string builder with no characters in it and an
     * initial capacity of 16 characters.
     */
    public StringBuilder() {
        super(16);
    }

StringBuffer的insert方法:

    /**
     * @throws StringIndexOutOfBoundsException {@inheritDoc}
     * @since      1.2
     */
    @Override
    public synchronized StringBuffer insert(int index, char[] str, int offset,
                                            int len)
    {
        toStringCache = null;
        super.insert(index, str, offset, len);
        return this;
    }

StringBuilder的insert方法:

    StringBuilder:
    /**
     * @throws StringIndexOutOfBoundsException {@inheritDoc}
     */
    @Override
    public StringBuilder insert(int index, char[] str, int offset,
                                int len)
    {
        super.insert(index, str, offset, len);
        return this;
    }

** <font color='red'>每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,由此可知String执行效率的低下,而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,速度自然也就快了。查看StringBuilder和StringBuffer的源码可知,StringBuffer的关键操作前加上了synchronized同步锁,是该操作线程安全的同时,也降低了StringBuffer的执行效率。</font>**

2.一个特殊的例子

String str = “Hello” + “ world” + “ !”;
StringBuffer builder = new StringBuilder(“Hello”).append(“world”).append(“ !”);
```language

当声明字符串变量时使用这种方式时,String和StringBuffer的差距并不大,这是因为jvm在解析的时候
String str= ”Hello“+"world"+"!";
其实等于:
String Str = "Hello world!";

所以所需的时间并不多,但是如果你的字符串是来自其他String变量的话,jvm还是会按照原来的方式去执行。

3.线程安全

上诉源码中有提到,StringBuffer为线程安全的,而StringBuilder为线程不安全的。

4.总结

对于三者使用的总结:
1.如果要操作少量的数据用 String
2.单线程操作字符串缓冲区 下操作大量数据 StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 StringBuffer

上一篇 下一篇

猜你喜欢

热点阅读