2014-02-11 40 views
2

有没有什么办法让ArrayList的内部数组不被重复?Java ArrayList toArray避免复制

我有一个函数,它需要一个普通的java数组作为输入,我想调用一个ArrayList的内容。问题是我会非常频繁地调用它,每次复制都会导致性能问题。

+0

你怎么知道ArrayList有一个“内部数组”?它可能是一个链表或任何其他结构。 –

+2

@HotLicks:链表会使O(1)随机访问棘手... –

+2

@HotLicks真的吗? “ArrayList”的含义是什么? – Henry

回答

2
​​

请注意,每次数组列表被调整大小时都需要重新执行此操作。然后再次,这是脆弱和可怕的,你永远不应该做的一开始。


如果您需要随机存取处理您的数据,但元素的数量可以增长,你不能把一个上限上,然后ArrayList是概念上的工作的工具。在这种情况下,你应该做的是重构你的处理代码,以便与Lists一起工作。像ArrayList这样的随机存取实现为您提供了所有的数组,所以我原则上没有发现任何问题。

+1

脆弱和可怕,可能无法在任何其他版本的Java和...是的。 querent确实说“任何方式”,这可能是一种方式,所以这是一个正确的答案。我仍然没有决定我是否能够良心投票。 – keshlam

+0

在这种情况下,这是独特的解决方案,即使他打破了“失能”。所以+1。 –

+0

请注意,这个(可怕的)方案不会返回数组的大小。 –

1

不是我所知道的。然而,没有什么说你不能创建你自己的实现List,它是围绕一个暴露的Array。线程安全性和可变性 - 以及如果进一步附加到列表中会导致关联被迫重新分配数组,这个事实将会丢失 - 这是您不得不处理的问题,但没有理由不能做出来这行得通。

这就是接口的好处 - 如果一个实现没有你需要的特性,你可以创建另一个。

2

写你自己的数组列表实现公共访问支持数组,或从fastutil使用一个不同于任何现有的Java集合lib中,例如ObjectArrayList<E>有方法E[] elements()。是的,单个类的依赖关系有点奇怪,但是如果你关注性能,你可以找到有用的集合的原始特化。