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

Moh*_*and 106 java arrays arraylist dynamic

我想知道如何初始化一个整数数组,以便它的大小和值在我的程序执行中发生变化,任何建议?

Pop*_*ops 117

是的:使用ArrayList.

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

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

一个警告:ArrayList只能保存对象(例如整数),而不能保存基元(例如整数).在大多数情况下,autoboxing/autounboxing会默默地为你处理这个问题,但是根据你正在做的事情你可能会得到一些奇怪的行为.

  • @jerry_sjtu是的,当程序继续时,数组不会改变大小以匹配`size`; 当执行该行时,它会获得"size"中的任何大小. (12认同)
  • 我想知道为什么以下代码在java中是正确的?`int [] array = new int [size];``size`是一个变量,但是数组的长度必须是固定的,对不对?@Lord Torgamus (2认同)

Mat*_*mes 36

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

代替

Integer[] ints = new Integer[x]
Run Code Online (Sandbox Code Playgroud)

你用

List<Integer> ints = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为什么使用`List <Integer>`而不是`ArrayList <Integer>`? (4认同)

Mne*_*nth 23

一旦实例化,数组就是固定大小.您可以改用List.

Autoboxing使List可以像数组一样使用,你可以简单地将int值放入其中:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Run Code Online (Sandbox Code Playgroud)

  • 为什么声明List类型的引用变量,而不是ArrayList? (2认同)
  • 因为它允许您在需要时简单地在List实现之间切换,所以您只需要更改新的XYZList().如果变量声明为ArrayList,则oyu可能会使用特定于此实现的方法,从而使更改变得更加复杂. (2认同)

小智 11

我不同意之前提出的答案ArrayList,因为ArrayList不是动态数组而是由数组支持的List.不同之处在于您无法执行以下操作:

ArrayList list = new ArrayList(4);
list.put(3,"Test");
Run Code Online (Sandbox Code Playgroud)

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


Anu*_*man 10

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]);
}    
}

}
Run Code Online (Sandbox Code Playgroud)

来源:如何制作动态数组


Hao*_*eng 7

  1. 建议使用List来处理小规模的尺寸.

  2. 如果你有大量的数字,千万不要使用List和autoboxing,

    列出<整数>列表

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

int[] array = new int[ESTIMATED_SIZE];
Run Code Online (Sandbox Code Playgroud)