【发布时间】:2014-05-29 02:47:54
【问题描述】:
在一个学校项目中,我被要求用 Java 编写一个简单的数学解析器。该程序运行良好。太好了,我使用 NetBeans 分析器工具来检查程序的性能。为此,我对以下表达式的数学解析器进行了 1000 次调用:"1-((x+1)+1)*2",其中x 被当前循环计数替换。花了262ms。问题是,splitFormula 方法花费了 50% 的时间,我将在下面介绍:
private static void splitFormula(String formula){
partialFormula=new ArrayList<>();
for(String temp: formula.split("\\+|\\-|\\*|\\/"))
partialFormula.add(temp);
}
,其中 partialFormula 是字符串的 ArrayList。要对表达式进行数值计算,我需要多次调用 splitFormula 方法,所以我真的需要清除 partialFormula ArrayList 的内容 - 第一行。
我的问题是:有没有更快的方法来拆分字符串,然后将部分字符串添加到数组列表中?还是有其他方法可以用来分割字符串然后使用子字符串?
【问题讨论】:
-
ArrayLists 以一定的大小开始并不断增长。例如,如果数组列表的大小为 10,并且您添加了第 11 个元素,则分配一个大小为 20 的新数组列表,并将旧数组列表的所有元素复制到新的数组中,依此类推。改用链表。
-
@MohanKumar 我不知道。让我看看你的建议。谢谢。
-
我在想。使用
partialFormula.clear()而不是以上述方式“清除”它不是更好的主意吗? -
我认为您需要使用 Pattern 和 Matcher 手动解析公式。
-
@MohanKumar 链表增加了间接性,数组没有。增长操作几乎总是在缓存上执行,这比链表间接引入的开销要快得多
标签: java performance arraylist split