我想知道如何在数组末尾添加或追加新元素。有没有简单的方法在最后添加元素?我知道如何使用StringBuffer,但我不知道如何使用它来添加数组中的元素。没有ArrayList或列表我更喜欢它。我想知道StringBuffer是否适用于整数。
答案 0 :(得分:8)
您无法向数组添加元素,因为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
。
答案 1 :(得分:3)
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 :(得分:1)
OP说,出于不明原因,“我更喜欢没有arraylist或列表。”
如果你所指的类型是原语(你提到整数,但你没有说你的意思是int
还是Integer
),那么你可以使用其中一个NIO Buffer类比如java.nio.IntBuffer
。这些行为与StringBuffer
非常相似 - 它们充当原始类型列表的缓冲区(缓冲区存在于所有基元但不存在于对象中),并且您可以在数组周围包装缓冲区和/或提取来自缓冲区的数组。
请注意,javadocs说:“缓冲区的容量永远不会消极,永远不会改变。”它仍然只是一个数组的包装器,但它更适合使用。有效扩展缓冲区的唯一方法是allocate()
更大的缓冲区,并使用put()
将旧缓冲区转储到新缓冲区中。
如果它不是原始的,你应该只使用List
,或者提出一个令人信服的理由,为什么你不能或不会,也许有人会帮助你解决它。
答案 3 :(得分:1)
正如许多人指出的那样,如果你试图在列表的末尾添加一个新元素,那么像array [array.length-1] = x;应该做。但这将取代现有元素。
用于连续添加数组的内容。您可以跟踪索引并继续添加元素,直到达到结束并具有添加功能,返回下一个索引,这反过来将告诉您可以在阵列中容纳多少元素。
当然,在这两种情况下,阵列的大小都是预定义的。 Vector可以是你的另一个选项,因为你不需要arraylist,这将允许你所有相同的功能和功能,并另外将负责增加大小。
来到你想要StringBuffer数组的部分。我相信你要找的是getChars(int srcBegin,int srcEnd,char [] dst,int dstBegin)方法。调查它可能会解决你的疑虑。我想再次指出,在设法从中获取数组后,您仍然只能替换最后一个现有元素(在这种情况下为字符)。
答案 4 :(得分:0)
正确使用术语:由于数组是固定长度的结构(并且现有的长度不能改变),表达式在末尾添加是没有意义的(单独)。
你可以做的是创建一个更大的新数组,并在最后一个插槽中填入新元素:
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是一个不错的选择。不要重新发明轮子。
答案 5 :(得分:0)
单线流
Stream.concat(Arrays.stream( array ), Stream.of( newElement )).toArray();