Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java remove()方法太慢_Java_List_Map - Fatal编程技术网

Java remove()方法太慢

Java remove()方法太慢,java,list,map,Java,List,Map,我在读取内存跟踪时遇到问题。我已经读过了,并把这些页面和它们的参考资料保存在地图上 地图结构: Map<Integer, List<Integer>> map = new HashMap<>(); 问题是删除这些引用需要太长时间,而对于大型跟踪,删除引用需要几个小时。有人有别的解决办法吗 谢谢大家! 我认为如果remove(0)是您将在此列表上执行的唯一删除操作,则LinkedList是一种更好的数据结构: Map<Integer, L

我在读取内存跟踪时遇到问题。我已经读过了,并把这些页面和它们的参考资料保存在地图上

地图结构:

    Map<Integer, List<Integer>> map = new HashMap<>();
问题是删除这些引用需要太长时间,而对于大型跟踪,删除引用需要几个小时。有人有别的解决办法吗


谢谢大家!

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

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

Map Map=newhashmap();

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


另外,看一看。它在逻辑上是一个
映射
,带有一个
集合
,就像您在这里看到的那样,但是它是一个更好的界面。在番石榴图书馆里还有很多其他令人惊奇的课程,如果你还没有使用它们,你也应该去看看

谢谢,我还原了LinkedList并从末尾删除,现在只需4秒钟即可读取跟踪


编辑:从末尾恢复和删除并没有改变结果,我犯了一个错误。仅仅使用LinkedList而不是ArrayList就解决了我的问题。

您使用的是
List
的什么实现?抱歉,这是ArrayList实现谢谢,我还原了LinkedList并从末尾删除了它,现在只需4秒钟即可读取跟踪。使用LinkedList没有任何区别(应该是这样的),我将尝试颠倒列表顺序,然后按照您所说的从末尾删除。非常感谢。对不起,我确实更改了时间。从我追踪的17分钟到10分钟。不幸的是,我需要更快的速度。访问文件要比从
链接列表
中删除节点或从
数组列表
中删除最后一个元素慢得多。您确定您看到的速度缓慢肯定是由于列表删除而不是文件访问造成的吗?另外,试着在你的
BufferedReader
中测试缓冲区的大小,或者根本不指定大小,而是使用默认大小。是的,我试着用-1代替删除,而且速度非常快,但是,我需要再次测试,每次我访问地图时,它是否==-1。请随意接受并向上投票建议颠倒列表并从末尾删除的答案(提示,提示)。但是如果你看一下,你会发现删除
LinkedList
中的第一个元素应该是非常快的,所以我觉得好像发生了别的事情。可能是由于LinkedList中的节点创建和删除太快而导致了一些GC开销?抱歉,id确实更改了时间。从我追踪的17分钟到10分钟。不幸的是,我需要更快。但是谢谢你的提示!;)@FelipeCarminati 10分钟后取下LinkedList的头部?我敢肯定,这种方法不存在速度慢的问题。列表中有多少个元素?我正在读取大文件,从文件中读取页面引用后,我立即转到地图中该页面的引用列表,并删除第一个元素。对于我正在测试的跟踪,我删除了第一个元素770万次。(对我的英语感到抱歉)。@FelipeCarminati-删除链接列表的第一个元素770万次只需要几秒钟。。。不管名单的长度。这不是代码中的瓶颈所在。我建议你对此要科学。描述你的代码。@FelipeCarminati确保用旁边的勾号将对你帮助最大的答案标记为“已接受”。这样,面临同样问题的人们将很快看到解决方案。
Map<Integer, LinkedList<Integer>> map = new HashMap<Integer, LinkedList<Integer>>();