为什么StringBuilder追加()比LinkedList add()更快?

时间:2015-07-30 07:41:01

标签: java algorithm collections linked-list stringbuilder

我试图基于LinkedList结构创建新的StringBuilder。

如你所知,Java的StringBuilder append()操作就像数组列表add()操作一样(当容量超过时调整值数组的大小)。

我意识到插入String时,StringBuilder.append()LinkedList.add()

更快

(*它是列表的纯添加过程。)

以下是代码段:

        List<String> linkedList = new LinkedList<>();
        StringBuilder stringBuilder = new StringBuilder();

        int loopCount = 5_000_000;

        long s, e;

        s = System.currentTimeMillis();
        for (int i = 0; i < loopCount; i++) {
            linkedList.add(UUID.randomUUID().toString() + "\n");
        }
        e = System.currentTimeMillis();
        System.out.println("LinkedList: "+(e - s));

        s = System.currentTimeMillis();
        for (int i = 0; i < loopCount; i++) {
            stringBuilder.append(UUID.randomUUID().toString() + "\n");
        }
        e = System.currentTimeMillis();
        System.out.println("String Builder: " + (e - s));

这些是基准测试结果。(基于500万插入)

StringBuilder: 13892 millisec
LinkedList:    19561 millisec

我还用ListIterator.add()更改了add()方法,但我没有改变任何内容。

以下是我的问题:如何实现该列表add()方法变得比StringBuilder.append()更快?

1 个答案:

答案 0 :(得分:1)

将项目添加到LinkedList时,会创建新的Node对象

void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

Node对象包含对下一个和上一个节点的引用。

StringBuilder通过本地System.arraycopy将字符串字符附加到基础数组,因此不会创建任何实例。

这可能会影响创建多个这些Node实例的时间。