Java ArrayList toArray避免复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java ArrayList toArray避免复制相关的知识,希望对你有一定的参考价值。

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

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

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

另一答案

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

另一答案

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

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

以上是关于Java ArrayList toArray避免复制的主要内容,如果未能解决你的问题,请参考以下文章

java中的toArray(数组名字)是啥意思,要把数组怎么处理?

ArrayList中的toArray方法

使 arrayList.toArray() 返回更具体的类型

转ArrayList的toArray,也就是list.toArray[new String[list.size()]];,即List转为数组

ArrayList_toArray

Java学习笔记集合转数组---toArray()