如何在Java中制作可调整大小的数组?

2022-09-03 17:41:16

在Java中做一个可调整大小的数组的最佳方法是什么?我尝试使用Vector,但是当你进行插入时,所有元素都会转移过来,我需要一个可以增长但元素保持在原位的数组。我相信有一个简单的答案,但我仍然不太确定。


答案 1

作为替代方法,您可以使用 ArrayList。它是 List 接口的可调整大小的数组实现。

用法(使用字符串):

List<String> myList = new ArrayList<String>();
myList.add("a");
myList.add("c");
myList.add("b");

顺序就像你把它们放进去一样:a,c,b。

您还可以获得如下所示的单个项目:

String myString = myList.get(0);

这将给你第0个元素:“a”。


答案 2

正如三条所指出的:“”。列表接口可以由数组支持(例如ArrayList,如Kevin在他的帖子中指出的那样)。当列表结构已满并且必须将新项添加到列表中时。然后,结构首先创建一个新数组,该数组可以包含旧元素以及必须添加到列表中的新元素。An array is a static datastructure, so they can't grow

列表接口具有不同的实现,这些实现都有优点/缺点,您应该选择最能解决您的问题集的实现。下面我将尝试给出一个简短的摘要,何时使用哪种实现:

不是线程安全实现:

  • ArrayList:List 接口的可调整大小的数组实现。当您执行大量在恒定时间内运行的操作时,应使用此实现。该操作在摊销常量时间内运行,即添加 n 个元素需要 O(n) 时间。我认为在进行更多查找()然后将项目添加到list()时,您应该使用此实现。size, isEmpty, get, set, iterator, and listIteratoraddget()add()
  • LinkedList:此实现不是由数组备份的,而是将节点“链接”在一起。在我看来,当你做更多的事情时,你应该使用这个实现。add()get()

线程安全实现:

请注意,这些列表实现不是线程安全的,这意味着从多个线程访问它们时可能会获得争用条件。如果你想使用来自多个线程的List实现,我建议你研究java.util.concurrent包并使用该类的实现。