ArrayList的java更快访问版本?
有人知道类似于ArrayList的东西能更快地处理大量数据吗
我有一个程序,它有一个非常大的ArrayList,当它试图探索或修改ArrayList时,它会被阻塞
大概当你这么做的时候:
//i is an int;
arrayList.remove(i);
幕后的代码运行如下:
public T remove(int i){
//Let's say ArrayList stores it's data in a T [] array called "contents".
T output = contents[i];
T [] overwrite = new T [contents.length - 1];
//Yes, I know generic arrays aren't created this simply. Bear with me here...
for(int x=0;x<i;x++){
overwrite[x] = contents[x];
}
for(int x=i+1;x<contents.length;x++){
overwrite[x-1] = contents[x];
}
contents = overwrite;
return output;
}
当ArrayList的大小大约为几百万个单位时,所有这些重新排列数组中项目位置的循环都将花费大量时间
我试图通过创建自己的自定义ArrayList子类来缓解这个问题,该子类将数据存储分割成更小的ArrayList。任何需要ArrayList扫描其数据以查找特定项的进程都会为其中每个较小的ArrayList生成一个新的搜索线程(以利用我的多个CPU核)
但这个系统不起作用,因为当调用搜索的线程在任何ArrayList中同步了一个项目时,它会阻止这些单独的搜索线程完成搜索,这反过来会锁定在进程中调用搜索的原始线程,基本上会使整个程序死锁
我真的需要某种面向数据存储的类,能够以PC机的速度容纳和操作大量对象
有什么想法吗
# 1 楼答案
链表的一个很好使用的例子是,链表元素非常大,即足够大,只有一个或两个可以同时放入CPU缓存。在这一点上,像用于迭代的向量或数组这样的连续块容器所具有的优势或多或少是无效的,如果实时发生许多插入和删除,那么性能优势可能是可能的
参考:Under what circumstances are linked lists useful?
参考:https://coderanch.com/t/508171/java/Collection-datastructure-large-data