remove()方法太慢了

时间:2012-08-26 23:25:49

标签: java list map

我在读取内存跟踪时遇到问题。我已经阅读并将页面及其参考文献保存在地图上

地图结构:

    Map<Integer, List<Integer>> map = new HashMap<>();

然后我再次读取文件并从整数列表中删除引用

FileReader arq = new FileReader(new File(Path));
BufferedReader reader = new BufferedReader(arq, 41943040);
while ( (std = reader.readLine()) != null ) {
        requestedPage = Integer.parseInt(std, 16);
        //do something
        M.map.get(requestedPage).remove(0));
    }

问题是删除这些引用需要很长时间,而对于大跟踪,删除引用需要数小时。有没有人有其他解决方案?

谢谢!

3 个答案:

答案 0 :(得分:3)

我认为如果remove(0)是您要在此列表中进行的唯一删除操作,则LinkedList是一个更好的数据结构:

尝试:

Map<Integer, LinkedList<Integer>> map = new HashMap<Integer, LinkedList<Integer>>();

答案 1 :(得分:1)

如果列表非常大,问题可能是索引1到大小为1的所有元素都必须移动:逻辑上,索引n处的项目移动到索引n-1。如果查看the ArrayList source,您可以看到有一个System.arrayCopy调用来执行此操作。您报告操作所花费的时间使得听起来有更深层次的问题,但您可以尝试使用LinkedList或重新编写算法,以便从列表末尾删除元素而不是比前面。使用LinkedList时,将删除head元素,而不需要修改其他节点。如果坚持ArrayList但每次都删除最后一个元素而不是第一个元素,则不需要arrayCopy。

另外,请查看Guava's Multimap。它在逻辑上是一个Map,值为Collection,就像你在这里一样,但它是一个更好的界面。在番石榴图书馆里有很多其他令人惊叹的课程,如果你还没有使用它们,你也应该查看它们!

答案 2 :(得分:0)

谢谢,我还原了LinkedList并从最后删除了,现在只需要4秒就可以读取跟踪。

编辑:从最后还原和删除DID没有改变结果,我犯了一个错误。只使用LinkedList而不是ArrayList解决了我的问题。