String,StringBuilder和StringBuffer类

今天看了一下子关于String的一类的书,大概了解了String,StringBuilder和Stringuffer的区别。下面我就来浅谈一下关于这三部分的差异。安全

public class Test {

        int loopCount = 10000; // 执行添加操做10000次

        public static void main(String[] args) {
            Test test = new Test();
            test.testString();
            test.testStringBuffer();
            test.testStringBuilder();
        }

        private void testString() {
            long startTime = System.nanoTime();// 得到当前系统最准确的计时器,以毫微秒为计时单位
            String temp = "";
            for (int i = 0; i < loopCount; i++) {
                temp += i;
            }
            long endTime = System.nanoTime();
            System.out.println("String运行时间: " + (endTime - startTime));
        }

        private void testStringBuffer() {
            long startTime = System.nanoTime();// 得到当前系统最准确的计时器,以毫微秒为计时单位
            StringBuffer temp = new StringBuffer("");
            for (int i = 0; i < loopCount; i++) {
                temp.append(i);
            }
            long endTime = System.nanoTime();
            System.out.println("StringBuffer运行时间: " + (endTime - startTime));
        }

        private void testStringBuilder() {
            long startTime = System.nanoTime();// 得到当前系统最准确的计时器,以毫微秒为计时单位
            StringBuilder temp = new StringBuilder("");
            for (int i = 0; i < loopCount; i++) {
                temp.append(i);
            }
            long endTime = System.nanoTime();
            System.out.println("StringBuilder运行时间: " + (endTime - startTime));
        }
}

首先,运行这三个String差异,能够看出时间上差别很大app

String运行时间: 606270951
StringBuffer运行时间: 1167296
StringBuilder运行时间: 746880

Process finished with exit code 0

ide

String作字符串的拼接中函数

  String是一个不可变的线程安全的一个函数,关于字符串拼接,其调用oop

/** The value is used for character storage. */
private final char value[];

因为final是一个不可变的,因此每一次的调用,都须要建立一个新的对象。
ui

String new=“this”+“is”+“a day“;this

这样的拼接方式,编译器直接给你拼接为this is a day 实际上就是调用了Stringbuffer直接拼接而成,因此时间和StringBuffer其实差很少。可是若是是String str1="this",String str2="is";String str3="a day";String str=str1+str2+str3;这种形式的话,就是真实的按照String拼接。String的拼接,因为使用final做为不可变参数,因此线程安全。线程

而StringBuffer,因为须要字符串的拼接,因此有一些独特的用于拼接字符串的方法。code

@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;
}

/**
 * @throws StringIndexOutOfBoundsException {@inheritDoc}
 * @since      1.2
 */
@Override
public synchronized StringBuffer delete(int start, int end) {
    toStringCache = null;
    super.delete(start, end);
    return this;
}

这些方法,是用来作字符串拼接有关,咱们能够见到synchronized,其中全部的方法都给加了锁,因此这个方法也是线程安全的。对象

   

private transient char[] toStringCache;

关于字符串拼接,因为不是不可变的,因此速度会快。

另外一个的话,和StringBuffer差很少,可是线程不安全。

关于StringBuffer和StringBuilder他们共同继承了

AbstractStringBuilder

和序列化


public AbstractStringBuilder append(char[] str) {
    int len = str.length;
    ensureCapacityInternal(count + len);
    System.arraycopy(str, 0, value, count, len);
    count += len;
    return this;
}

这一部分是字符串拼接部分

相关文章
相关标签/搜索