数组中相当于push()或pop()的方法是什么?

95

我正试图在我的主Java文件中添加、删除和引用一个数组中的项目,但我很难弄清楚正确的语法。在ActionScript中,它们有push()和pop()来添加和删除数组中的项目,那么在Android中是否有相当的功能?


1
你有什么类型的数组?你能展示一些代码吗? - EboMike
int[] intArray = new int[]{2, 3, 5, 8, 13}; 我该如何引用intArray[3],或者一个接一个地引用所有项? - clayton33
5个回答

56

在Java中,数组具有固定的大小(初始化后),这意味着您无法向数组添加或删除项。

int[] i = new int[10];

上述代码片段意味着整数数组的长度为10。无法添加第11个整数,除非重新分配一个指向新数组的引用,例如以下操作:

int[] i = new int[11];

在Java中,包java.util包含了各种数据结构,可以处理类似数组的集合中添加和删除项目。经典的数据结构Stack具有push和pop方法。


11
解释不错,但要记住,Stack 并不是很好的类,因为它继承自 Vector,所以它是完全同步的。因此,除非需要同步,否则 ArrayList 或 LinkedList 可能是更好的选择。 - M. Jessup

25

对于那些没有时间重构代码以将数组替换为Collection(例如ArrayList)的人来说,有一种替代方法。与Collection不同,数组的长度不能被改变,但是可以像这样替换数组:

array = push(array, item);

缺点是:

  • 每次 push 操作都需要复制整个数组,
  • Object 原始数组未被更改,因此您必须根据需要更新变量。

这里是 Stringpush方法:

(您可以创建多个push方法,一个用于String,一个用于int等)
private static String[] push(String[] array, String push) {
    String[] longer = new String[array.length + 1];
    for (int i = 0; i < array.length; i++)
        longer[i] = array[i];
    longer[array.length] = push;
    return longer;
}

这种替代方法更加高效,代码更短但更难阅读:

private static String[] push(String[] array, String push) {
    String[] longer = new String[array.length + 1];
    System.arraycopy(array, 0, longer, 0, array.length);
    longer[array.length] = push;
    return longer;
}

16
我强烈反对使用这种方法。对于非常简单和小的数组,它不会有问题,但对于中等或较大的数组,每次添加一个项目时系统都需要遍历整个数组。如果你有一个有100多个项目的数组,并想再添加3个项目,那么它将执行303个操作。 - Panthro

22

39
不知道为什么接受了这个答案。正确的答案是 java.util.ArrayDeque 或 java.util.LinkedList。 - Rotem
1
@Rotem 我认为你可以在这里轻松地找到原因:https://dev59.com/AGoy5IYBdhLWcg3wlvGX - Eddie C.

7
你可以使用Arrays.copyOf()方法和一些反射,制作一个很好的辅助函数。
public class ArrayHelper {
    public static <T> T[] push(T[] arr, T item) {
        T[] tmp = Arrays.copyOf(arr, arr.length + 1);
        tmp[tmp.length - 1] = item;
        return tmp;
    }

    public static <T> T[] pop(T[] arr) {
        T[] tmp = Arrays.copyOf(arr, arr.length - 1);
        return tmp;
    }
}

用法:

String[] items = new String[]{"a", "b", "c"};

items = ArrayHelper.push(items, "d");
items = ArrayHelper.push(items, "e");

items = ArrayHelper.pop(items);

结果

原始: a,b,c

push调用后的数组: a,b,c,d,e

pop调用后的数组: a,b,c,d


Arrays.copyOf() creates new array each time it's called. If you have to pop quite a long array in a loop, performance will be much worse than for (...) {String stringC = stringA + stringB} - Farid

6

您可以使用LinkedList。它具有peek、poll和offer方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接