如何在Java中创建可调整大小的数组?

Sor*_*son 12 java arrays implementation resizable

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

Kev*_*ell 23

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

用法(使用String):

List<String> myList = new ArrayList<String>();
myList.add("a");
myList.add("c");
myList.add("b");
Run Code Online (Sandbox Code Playgroud)

订单就像你把它们放进去一样:a,c,b.

您还可以获得这样的单个项目:

String myString = myList.get(0);
Run Code Online (Sandbox Code Playgroud)

这将给你第0个元素:"a".


Alf*_*red 5

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

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

非线程安全的实现:

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

线程安全的实现:

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