首页 > 解决方案 > 从字符列表中创建字符串然后清除它的最有效方法

问题描述

我正在尝试创建一种类似 JSON 的格式来从文件中加载组件,并且在编写解析器时遇到了一个有趣的性能问题。

解析器逐字符读取文件,所以我有一个 LinkedList 作为缓冲区。在到达键 ( :) 或值 ( ,) 的末尾后,缓冲区必须被清空并由它构造一个字符串。

我的问题是最有效的方法是什么。

我最好的两个选择是:

for (int i = 0; i < buff.size(); i++)
    value += buff.removeFirst().toString();

value = new String((char[]) buff.toArray(new char[buff.size()]));

标签: javastringlinked-list

解决方案


而不是猜测这个你应该写一个基准。看一下How do I write a correct micro-benchmark in Java了解如何使用JMH编写基准。

当您使用运算符连接 1 个字母时,您for的循环将效率低下。这会导致创建并立即丢弃中间对象。如果您打算在循环中连接,则应该使用。String+StringStringBuilder

根据Arrays of Wisdom of the Ancients文章,第二个选项应该使用零长度数组,该文章深入探讨了 JVM 的内部细节:

value = new String((char[]) buff.toArray(new char[0]));

推荐阅读