繁体   English   中英

LinkedList和ArrayList之间的中介

[英]Intermediate between LinkedList and ArrayList

在下面的代码中,我得到了查询的结果,但对记录的总数却一无所知。 我必须将其存储在容器中。 当我读取容器的每个记录时,它将是一个简单的循环,因此将不使用基于索引的访问。

  List<MyObject> list;

  while ( source.hasNext() ) {
      MyObject ob = new MyObject();
      convertObject(ob, source.next());
      list.add(ob);
  }

  ...

  //Another method

  for (MyObject ob : objects){
    showThings(ob);
  }

LinkedList很差,因为它会创建许多带有指向下一个指针的小对象。 它使用更多的内存,使内存更加分散,并且有更多的缓存丢失。

ArrayList很差,因为我不知道要插入的记录数。 每当我插入新项目并且内部数组已满时,它将分配更大的内存块并将所有内容复制到新块。

我在java.util中找不到任何解决方案。 因此,我考虑编写一个自定义列表。 它就像一个LinkedList,但是每个单元格都是一个数组。 换句话说,第一个节点将类似于ArrayList,但是当它已满并且我插入一个新对象时,它将创建另一个具有数组的节点以插入新项,而不是复制所有内容。 但是,我可能会以某种方式重新发明轮子。

每当我插入新项目并且内部数组已满时,它将分配更大的内存块并将所有内容复制到新块中

这是不正确的,您可以预分配任意大小的哈希数组,并且仅在空间用完时才递增,每次增加50%,因此,如果您对预期的大小有合理的猜测,甚至可以猜测数量众多时,重新分配成本将为零或最小。

一些谷歌搜索公布了布朗尼收藏的GapList 它以块的形式组织其内容,并通过将它们排列在树中进行管理。 如果删除元素后它们变得稀疏,它也会阻止合并。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM