Arm*_*rmo 2 java arrays list data-structures
我正在尝试从数组初始化ArrayList,但只是在给定原始数组和子数组开始和结束索引的情况下初始化子数组.
我只能想到做这样的事情来从子阵列创建一个新的列表:
Arrays.asList(Arrays.copyOfRange(arr, i, j));
Run Code Online (Sandbox Code Playgroud)
或者只是手动将元素添加到列表中
List<Integer> result = new ArrayList<>(k);
for (int i = left; i < left + k; i++) {
result.add(arr[i]);
}
Run Code Online (Sandbox Code Playgroud)
这显然不是很漂亮.有没有更好的方法来通过传递数组和索引来做到这一点?
"更好"取决于您的要求和用例.由于你建议使用Arrays.asList(...),它返回一个固定大小的列表,我将在这里假设一个固定大小的列表足以满足你的需要.
可能最快的方式是使用
Arrays.asList(arr).subList(i, j);
Run Code Online (Sandbox Code Playgroud)
这将很快,因为没有元素被复制到任何地方,并且不执行迭代.Arrays.asList(arr)本质上创建一个列表,它是原始数组的包装器,并subList(...)创建一个列表,该列表是现有列表的视图.
权衡(总是需要权衡)是保留对原始数组的引用.因此,如果您生成大量的大型数组,并希望保留每个数组的一小部分,那么从内存消耗的角度来看,这将是一个糟糕的选择.(相反,如果你有一个大型阵列,并且需要大量不同的切片,可能会重叠,这将是一种非常节省内存的方法,而且速度很快.)
如果内存考虑意味着您需要释放对原始数组的任何引用,那么您将被迫以某种方式将元素复制到新结构.可能最有效的方法是使用你建议的方法:Arrays.copyOfRange(...)基本上委托System.arrayCopy(...),它基本上是在大多数系统上本地实现的(连续的一块内存的大量副本),然后像以前Arrays.asList(...)一样为它创建一个列表包装器新阵列.因此,在您要释放对原始数组的引用的场景中,建议使用
Arrays.asList(Arrays.copyOfRange(arr, i, j));
Run Code Online (Sandbox Code Playgroud)
可能是"最好的"方法.