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