我有一个操作非常大的列表的功能,超过大约250,000个项目.对于大多数这些项目,它只是替换位置x处的项目.但是,对于它们中的大约5%,它必须从列表中删除它们.
使用LinkedList似乎是避免昂贵删除的最明显的解决方案.然而,自然地,随着时间的推移,通过索引访问LinkedList变得越来越慢.这里的成本是几分钟(其中很多).
在LinkedList上使用Iterator也很昂贵,因为我似乎需要一个单独的副本来避免在编辑该列表时出现Iterator并发问题.这里的费用是几分钟.
然而,这是我的思绪被吹嘘的地方.如果我更改为ArrayList,它几乎立即运行.
对于包含297515个元素的列表,删除11958个元素并修改其他所有元素需要909ms.我确认结果列表的大小确实是285557,如预期的那样,并包含我需要的更新信息.
为什么这么快?我查看了JDK6中ArrayList的源代码,它似乎正在按预期使用arraycopy函数.我很想理解为什么ArrayList在这里工作得很好,当常识似乎表明这个任务的数组是一个可怕的想法,需要移动几十万个项目.
我正在通过将所有变量声明为最高位置并将它们初始化为null/0 /而不是将它们声明为以后需要它们来为那些启动其功能的人清理Java代码.
针对此的具体指导原则是什么?对于这种或那种方式是否存在优化原因,或者只是一种良好的做法?是否存在偏离任何正确方法的可接受的情况?
我有一个我构建的应用程序,它使用通过ProcessBuilder调用的非Java可执行文件:
ProcessBuilder pb = new ProcessBuilder(invocation);
pb.redirectErrorStream(true);
Process proc = pb.start();
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
但是,我想将该应用程序整齐地捆绑到jar文件本身,而不是要求将它放在同一目录之外.有没有办法运行这个应用程序而不提取它?
如果我需要删除ProcessBuilder,那就没关系,只要它能正常工作.:)
java ×3
arraylist ×1
coding-style ×1
execute ×1
jar ×1
optimization ×1
performance ×1
syntax ×1
variables ×1