java - 为什么 StringBuilder append() 比 LinkedList add() 快?

标签 java algorithm collections linked-list stringbuilder

我正在尝试基于 LinkedList 结构创建新的 StringBuilder。

如您所知,Java 的 StringBuilder append() 操作类似于数组列表 add() 操作(当超出容量时调整值数组的大小)。

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

(*是list的纯添加过程)

这是代码片段:

        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() 更快?

最佳答案

当您将项目添加到 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 将 String 字符附加到底层数组,因此不会创建任何实例。

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

关于java - 为什么 StringBuilder append() 比 LinkedList add() 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31717877/

相关文章:

Java - 自定义单链表,删除所有出现的具有特定值的元素

algorithm - 在 Matlab 中查找唯一二进制排列的快速方法

java - 按两个标准排序以获得最终结果

java - spring boot启动时如何渲染多个json文件

java - Android Studio - 文本输入在键盘显示时隐藏字符

java - collection.stream().skip().findFirst()的效率

Java:如何将 String[] 转换为 List 或 Set

java - Hashmap 转换哪个更好

java - Eclipse 和 Netbeans 的共存情况如何?

java - 您如何找到 Java 中 sleep 中断的根本原因?