Java ArrayList toArray避免复制

问题描述 投票:2回答:3

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

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

java performance arraylist
3个回答
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这样的随机访问实现为您提供了数组所做的一切,所以原则上我没有看到任何问题。


2
投票

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.