我有以下代码:

String[] where;
where.append(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.append(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");

这两个追加没有编译。这是如何正确工作的?


当前回答

你可以简单地这样做:

System.arraycopy(initialArray, 0, newArray, 0, initialArray.length);

其他回答

Apache Commons Lang有

T[] t = ArrayUtils.add( initialArray, newitem );

它返回一个新数组,但如果你真的因为某种原因使用数组,这可能是最理想的方法。

正如tangens所说,数组的大小是固定的。但是你必须先实例化它,否则它将只是一个空引用。

String[] where = new String[10];

这个数组只能包含10个元素。所以一个值只能附加10次。在代码中,您正在访问一个空引用。这就是为什么它不起作用。为了有一个 动态增长的集合,使用数组列表。

你可以简单地这样做:

System.arraycopy(initialArray, 0, newArray, 0, initialArray.length);

我在Java方面不是很有经验,但我总是被告知数组是具有预定义大小的静态结构。 你必须使用数组列表或者向量或者其他动态结构。

使用List<String>,例如ArrayList<String>。它是动态增长的,不像数组(参见:Effective Java 2nd Edition, Item 25:首选列表而不是数组)。

import java.util.*;
//....

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list); // prints "[1, 2, 3]"

如果坚持使用数组,可以使用java.util.Arrays.copyOf分配一个更大的数组来容纳额外的元素。不过,这真的不是最好的解决方案。

static <T> T[] append(T[] arr, T element) {
    final int N = arr.length;
    arr = Arrays.copyOf(arr, N + 1);
    arr[N] = element;
    return arr;
}

String[] arr = { "1", "2", "3" };
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3]"
arr = append(arr, "4");
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3, 4]"

这是O(N) /追加。另一方面,ArrayList的每个操作的平摊代价是O(1)。

另请参阅

Java教程/数组 数组是一个容器对象,它包含固定数量的单一类型的值。数组的长度是在创建数组时建立的。在创建之后,它的长度是固定的。 Java教程/列表界面