Java ArrayList toArray避免复制

时间:2014-02-11 22:07:10

标签: java performance arraylist

有没有办法获得ArrayList的内部数组而不重复它?

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

3 个答案:

答案 0 :(得分:3)

static Object[] getBackingArray(ArrayList<?> arrayList) {
    try {
        Field elementData = ArrayList.class.getDeclaredField("elementData");
        elementData.setAccessible(true);
        return (Object[]) elementData.get(arrayList);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

请注意,每次调整数组列表时都需要再次执行此操作。再说一次,这很脆弱,你应该永远不要这样做。


如果您在处理数据时需要随机访问,但元素数量可以增长而且您无法设置上限,那么ArrayList在概念上就是适合该工作的工具。在这种情况下,您应该做的是重构您的处理代码以使用Lists。像ArrayList这样的随机访问实现为您提供了数组所做的一切,所以原则上我没有看到任何问题。

答案 1 :(得分:2)

编写您自己的数组列表实现,并具有对后备阵列的公共访问权限,或者使用任何现有Java Collections lib中的一个,例如来自ObjectArrayList<E>fastutil方法E[] elements()。是的,携带单个类的依赖有点奇怪,但是如果你关注性能,你可以找到有用的原始特征集。

答案 2 :(得分:1)

不是我知道的。但是,没有什么可以说你不能创建自己的List实现,它包含一个暴露的数组。线程安全性和可变性 - 以及如果进一步附加到List会导致它重新分配数组而失去关联的事实 - 将是您必须处理的问题,但是没有理由你不能做它有效。

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