如何在数组末尾添加元素?

12

我想知道如何向数组末尾添加或追加新元素。是否有简单的方法在末尾添加元素?我知道如何使用StringBuffer,但不知道如何将其用于数组中添加元素。我希望不使用ArrayList或list。我想知道StringBuffer是否适用于整数。


1
数组长度是固定的。如果你想要在末尾添加元素,使用可扩展的数据结构,比如List - khelwood
或者每次添加东西时创建一个新的数组。 - user253751
一个 ArrayList 对于数组就像一个 StringBuffer 对于 String。如果你想要添加元素并得到一个数组作为结果而不是一个 String,那么你确实想使用 ArrayList - MattLBeck
6个回答

11

由于在Java中,数组长度是固定的,因此无法向数组中添加元素。但是,您可以使用Arrays.copyOf(array, size)从现有数组构建一个新数组:

public static void main(String[] args) {
    int[] array = new int[] {1, 2, 3};
    System.out.println(Arrays.toString(array));
    array = Arrays.copyOf(array, array.length + 1); //create new array from old array and allocate one more element
    array[array.length - 1] = 4;
    System.out.println(Arrays.toString(array));
}

我仍然建议停止使用数组,改用List


5

Java中的数组长度是固定的,无法更改。因此,Java提供了一些类来维护可变长度的列表。

通常有 List<T> 接口,用于表示类 T 的实例列表。最简单和广泛使用的实现是 ArrayList。这是一个示例:

List<String> words = new ArrayList<String>();
words.add("Hello");
words.add("World");
words.add("!");

List.add() 方法会将一个元素添加到列表的末尾,List.size() 方法可以获取列表的大小。


2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - dcsohl

2

为了澄清术语:数组是固定长度的结构(现有数组的长度不能改变),“在末尾添加”这个表达本身没有意义。

你可以做的是创建一个新的数组,比原数组多一个元素,并将新元素填充到最后一个位置:

public static int[] append(int[] array, int value) {
     int[] result = Arrays.copyOf(array, array.length + 1);
     result[result.length - 1] = value;
     return result;
}

每次调用“append”时,都会创建一个新的数组,并将旧数组内容复制到新数组中,这很快变得效率低下。

大大减少开销的一种方法是创建一个较大的数组,并跟踪它实际填充的索引。添加元素就像填充下一个索引并递增索引一样简单。如果数组完全填满,则会创建一个具有更多空闲空间的新数组。

而ArrayList恰好做到了这一点。因此,在需要动态大小的数组时,ArrayList是一个不错的选择。不要重复造轮子。


1
该帖子的作者出于未知原因表示“我更喜欢不使用ArrayList或List”。
如果你所提到的类型是原始类型(你提到整数,但没有说明是指int还是Integer),那么可以使用NIO缓冲区类之一,如java.nio.IntBuffer。它们的作用很像StringBuffer——它们充当原始类型列表的缓冲区(所有原始类型都有缓冲区,但对象没有),你可以将缓冲区包装在一个数组周围和/或从缓冲区中提取数组。
请注意,javadoc中说,“缓冲区的容量永远不会为负数,也永远不会改变。”它仍然只是一个数组的包装器,但是一个更好用的包装器。有效扩展缓冲区的唯一方法是allocate()一个更大的缓冲区,并使用put()将旧缓冲区转储到新缓冲区中。
如果它不是原始类型,你应该只使用List,或者想出一个令人信服的理由,说明你不能或不想使用它,并且也许有人会帮助你解决这个问题。

1
许多其他人指出,如果您想在列表末尾添加新元素,则类似于array[array.length-1]=x;的代码应该可行。但这将替换现有元素。
对于像数组连续添加这样的操作,您可以跟踪索引并继续添加元素,直到达到末尾,并拥有执行添加操作的函数返回下一个索引,这反过来将告诉您数组中还可以容纳多少个元素。
当然,在这两种情况下,数组的大小都将是预定义的。Vector 可以是您的另一选择,因为您不想使用 arraylist,而后者将允许您使用所有相同的特性和功能,并额外处理增加大小的问题。
关于您想要将 StringBuffer 转换为数组的部分。我认为您正在寻找的是 getChars(int srcBegin, int srcEnd,char[] dst,int dstBegin) 方法。请查看它,可能会解决您的疑问。再次提醒,即使成功将其转换为数组,您仍然只能替换最后一个现有元素(在这种情况下为字符)。

1

使用流的一行代码

Stream.concat(Arrays.stream( array ), Stream.of( newElement )).toArray();

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