ChatGPT解决这个技术问题 Extra ChatGPT

Java中的可变长度(动态)数组

我想知道如何初始化一个整数数组,使其大小和值在我的程序执行过程中发生变化,有什么建议吗?


C
Chris McCauley

是:使用 ArrayList

在 Java 中,“普通”数组是固定大小的。您必须给它们一个大小,并且不能扩展它们或收缩它们。要更改大小,您必须创建一个新数组并复制您想要的数据 - 这对您来说效率低下并且很痛苦。

幸运的是,有各种实现通用数据结构的内置类,以及其他有用的工具。您需要查看 the Java 6 API 以获取它们的完整列表。

一个警告:ArrayList 只能保存对象(例如整数),不能保存基元(例如整数)。在大多数情况下,autoboxing/autounboxing 会默默地为您解决这个问题,但您可能会遇到一些奇怪的行为,具体取决于您在做什么。


我想知道为什么下面的代码在java中是正确的? int[] array = new int[size]; size 是一个变量,但数组的长度必须是固定的,对吗?@Lord Torgamus
@jerry_sjtu 是的,随着程序的继续,数组不会改变大小以匹配 size;执行该行时,它会获得 size 中发生的任何大小。
每当我从 ArrayList 中删除一个项目时,最后都会得到一个 null。任何想法为什么?
@AaronFranke 您如何删除该项目,您可以在这里发布您的完整代码吗?
M
MattGrommes

Java中的数组是固定大小的。您需要的是一个 ArrayList,它是 Java 中许多非常有价值的集合之一。

代替

Integer[] ints = new Integer[x]

你用

List<Integer> ints = new ArrayList<Integer>();

然后要更改列表,您可以使用 ints.add(y)ints.remove(z) 以及您可以在相应的 Javadocs 中找到的许多其他方便的方法。

我强烈建议研究 Java 中可用的 Collections 类,因为它们非常强大,并为您提供了许多 Java 新手倾向于尝试不必要地重写自己的内置功能。


想要工作直到我尝试: List ints = new ArrayList();
为什么使用 List<Integer> 而不是 ArrayList<Integer>
M
Mnementh

一旦实例化,数组的大小是固定的。您可以改用列表。

自动装箱使 List 类似于数组一样可用,您可以简单地将 int-values 放入其中:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

为什么要声明 List 类型的引用变量,而不是 ArrayList?
因为它允许您在需要时简单地在列表实现之间切换,所以您只需更改新的 XYZList()。如果变量声明为 ArrayList oyu 可能会使用特定于此实现的方法,从而使更改更加复杂。
谢谢,我明白了。
c
cspann

我不同意之前建议 ArrayList 的答案,因为 ArrayList 不是 动态数组,而是由数组支持的列表。不同之处在于您不能执行以下操作:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

它会给你一个 IndexOutOfBoundsException 因为在这个位置还没有元素,即使支持数组允许这样的添加。因此,您需要使用@randy-lance 建议的自定义可扩展数组实现


我不确定 ArrayList 是否有我在 Java8 源代码中看到的任何 put 方法。只是试图找出它在给定容量下的表现。但是找到了 ArrayList.add() 方法。
e
eckes

建议使用 List 来处理小规模的大小。如果你有大量的数字,永远不要使用 List 和自动装箱, List< Integer> list

对于每一个 int,都会自动创建一个新的 Integer。当列表的大小增加时,您会发现它变得越来越慢。这些整数是不必要的对象。在这种情况下,使用估计的大小会更好,

int[] array = new int[ESTIMATED_SIZE];

K
Konrad Garus

改用 List 怎么样?例如,ArrayList<integer>


G
Girish

您无法更改数组的大小。但是,您可以创建一个大小合适的新数组并将数据从旧数组复制到新数组。

但是您最好的选择是使用来自 jacarta commons 的 IntList。 (here)

它就像 List 一样工作,但占用的空间更少,效率更高,因为它存储 int 而不是在 int 上存储包装器对象(这就是 Integer 类的内容)。