Ste*_*n C 25
分配Java数组时,Java数组的大小是固定的,无法更改.
如果要"增长"或"缩小"现有数组,则必须分配适当大小的新数组并复制数组元素; 例如使用System.arraycopy(...)或Arrays.copyOf(...).复制循环也可以,虽然它看起来有点笨重...... IMO.
如果你想从一个数组中"删除"一个或多个项目(真正意义上的......不仅仅是替换它们null),你需要分配一个新的较小的数组并复制你想要保留的元素.
有第三方库形式的替代品(例如Apache Commons ArrayUtils),但您可能想要考虑是否值得添加库依赖项只是为了您可以用5-10行代码实现自己的方法.
使用类而不是数组更好(即更简单......在许多情况下,效率更高1)List.这将照顾(至少)增长后备存储.并且有一些操作负责在列表中的任何位置插入和删除元素.
例如,ArrayList该类使用数组作为后备,并根据需要自动增长数组.它不会自动减小后备阵列的大小,但您可以告诉它使用该trimToSize()方法执行此操作; 例如
ArrayList l = ...
l.remove(21);
l.trimToSize(); // Only do this if you really have to.
Run Code Online (Sandbox Code Playgroud)
1 - 我说它"在许多情况下更有效",因为ArrayList当需要增长后备阵列时,使用简单的"双倍大小"策略.这意味着如果通过重复追加来增加列表,则每个元素将平均复制一次.相比之下,如果您使用数组执行此操作,则最终会将每个数组元素平均复制接近N/2次.
Mar*_*iot 18
您本身无法调整数组大小,但您可以创建一个新数组,并使用以下实用函数有效地将元素从旧数组复制到新数组:
public static int[] removeElement(int[] original, int element){
int[] n = new int[original.length - 1];
System.arraycopy(original, 0, n, 0, element );
System.arraycopy(original, element+1, n, element, original.length - element-1);
return n;
}
Run Code Online (Sandbox Code Playgroud)
但是,更好的方法是使用ArrayList(或类似的List结构)来存储数据,然后使用其方法根据需要删除元素.
azr*_*lAT 12
使用ArrayUtils.removeElement(Object[],Object)org.apache.commons.lang是迄今为止最简单的方法.
int[] numbers = {1,2,3,4,5,6,7};
//removing number 1
numbers =(int[])ArrayUtils.removeElement(numbers, 1);
Run Code Online (Sandbox Code Playgroud)
由于数组具有在创建时分配的固定大小,因此唯一的选择是创建一个新数组而没有要删除的元素。
如果要删除的元素是最后一个数组项,则可以使用Arrays.copy以下命令轻松实现:
int a[] = { 1, 2, 3};
a = Arrays.copyOf(a, 2);
Run Code Online (Sandbox Code Playgroud)
运行上面的代码后,a现在将指向仅包含1、2的新数组。
否则,如果要删除的元素不是最后一个,则需要以size-1创建一个新数组,并将除要删除的元素之外的所有项目复制到该数组中。
上面的方法效率不高。如果您需要管理内存中可变的项目列表,最好使用列表。具体来说,LinkedList将在列表中删除一项O(1)(理论上最快)。
数组的大小是固定的,创建后无法调整它们的大小。您可以通过将现有项目设置为null:
objects[4] = null;
Run Code Online (Sandbox Code Playgroud)
但您无法从数组中删除整个槽并将其大小减少 1。
如果需要动态大小的数组,可以使用ArrayList. 有了它,您就可以add()和remove()对象一起使用,它会根据需要增大和缩小。
| 归档时间: |
|
| 查看次数: |
239463 次 |
| 最近记录: |