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


Answers:


121

是的:使用ArrayList

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

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

一个警告:ArrayList只能保存对象(例如Integer),而不能保存原语(例如ints)。在大多数情况下,自动装箱/自动拆箱将为您静默处理,但根据您的操作,您可能会得到一些奇怪的行为。


2
我想知道为什么下面的代码在Java中正确吗?int[] array = new int[size]; size是变量,但数组的长度必须固定,对吗?@ Torgamus勋爵
jerry_sjtu 2012年

12
@jerry_sjtu是的,size随着程序的进行,数组不会改变大小以匹配。size执行该行时,它会得到任何大小的信息。
2012年

每当我从ArrayList中删除一个项目时,最后都会以a null结尾。有什么想法吗?
亚伦·弗兰克

37

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

代替

Integer[] ints = new Integer[x]

你用

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

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

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


想要工作直到我尝试:List <Integer> ints = new ArrayList <Integer>();
gorbysbm 2014年

5
为什么用List<Integer>代替ArrayList<Integer>
Dean Meehan

25

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

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

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

2
为什么要声明类型为List而不是ArrayList的引用变量?
LppEdd

2
因为它允许您在需要时仅在列表实现之间切换,所以您只需要更改新的XYZList()。如果将变量声明为ArrayList,则oyu可能会使用特定于此实现的方法,从而使更改更加复杂。
Mnementh'2

1
谢谢,我了解。
LppEdd

11

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

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

这将为您提供IndexOutOfBoundsException,因为即使支持数组允许添加该元素,但此位置尚无任何元素。因此,您需要使用@ randy-lance建议的自定义可扩展数组实现



我不确定ArrayList是否具有任何Java8源代码中所示的put方法。只是尝试找出给定容量下的行为。但是找到了ArrayList.add()方法。
Sanjeet A

11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

来源:如何制作动态数组


7
  1. 建议使用列表处理小规模的文件。

  2. 如果您有大量数字,则永远不要使用列表和自动装箱,

    List <整数>列表

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

int[] array = new int[ESTIMATED_SIZE];


4

您不能更改数组的大小。但是,您可以创建一个具有正确大小的新阵列,并将数据从旧阵列复制到新阵列。

但是最好的选择是使用来自jacarta commons的IntList。(这里

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


-4

我回答了这个问题,不,您不需要arraylist或任何其他要做的事情,我完成了它,因此,可以增加数组的大小。这是 如何使用Java动态数组 的链接,这是我回答Java动态数组的问题的链接


1
这是错误的。链接的答案将调用System.arrayCopy(),将旧数组复制到大小增加的新数组中,然后添加新条目。数组仍然不能具有动态大小。
katzenhut 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.