gpt4 book ai didi

java - 从子数组创建列表而不在java中复制

转载 作者:行者123 更新时间:2023-12-03 21:27:39 26 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它.

4年前关闭。




Improve this question




我试图从一个数组初始化一个 ArrayList,但只是子数组,给定原始数组和子数组的开始和结束索引。

我只能想到做这样的事情来从子数组创建一个新列表:

Arrays.asList(Arrays.copyOfRange(arr, i, j));

或者只是手动将元素添加到列表中
List<Integer> result = new ArrayList<>(k);
for (int i = left; i < left + k; i++) {
result.add(arr[i]);
}

这显然不是很漂亮。有没有更好的方法通过传入数组和索引来做到这一点?

最佳答案

“更好”取决于您的要求和用例。既然你建议使用 Arrays.asList(...) ,它返回一个固定大小的列表,我在这里假设一个固定大小的列表足以满足您的需求。

可能最快的方法是使用

Arrays.asList(arr).subList(i, j);

这将很快,因为没有元素被复制到任何地方,也没有执行迭代。 Arrays.asList(arr)本质上创建了一个列表,它是原始数组的包装器, subList(...)创建一个列表,它是现有列表的 View 。

权衡(总是有权衡)是它保留了对原始数组的引用。因此,如果您要生成大量大型数组,并希望保留每个数组的一小部分,那么从内存消耗的角度来看,这将是一个糟糕的选择。 (相反,如果您有一个大数组,并且想要它的大量不同切片,可能会重叠,这将是一种非常节省内存并且速度很快的方法。)

如果内存考虑意味着您需要释放对原始数组的任何引用,那么您将被迫以某种方式将元素复制到新结构中。可能最有效的方法是使用您建议的方法: Arrays.copyOfRange(...)基本上代表 System.arrayCopy(...) ,它本质上是在大多数系统上本地实现的(连续内存块的批量复制),然后像以前一样 Arrays.asList(...)只需为该新数组创建一个列表包装器。因此,在您想要释放对原始数组的引用的情况下,您建议
Arrays.asList(Arrays.copyOfRange(arr, i, j));

可能是“最好的”方法。

关于java - 从子数组创建列表而不在java中复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48292292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com