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

标签 java arrays list data-structures

关闭。这个问题是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/

相关文章:

java - 错误:inflating class fragment

java - java中使用回调函数和直接调用静态函数有什么区别?

java - 使用完服务器端口后如何关闭它?

Java - 需要帮助找到数组的最短字符串,我与我所看到的很接近,但出现错误,

php - 在 foreach 循环中将多个项目添加到 PHP 数组 - 有更好的方法吗?

c# - 无法将字典 'Value' 复制到列表 - C#

c++ - 为什么下面的代码会崩溃?

java - 迭代器中的 .next 引发的并发修改异常

c - 从 C 中的数组中删除元素

Python合并不同长度列表的列表