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

Posted

技术标签:

【中文标题】Java中的可变长度(动态)数组【英文标题】:Variable length (Dynamic) Arrays in Java 【发布时间】:2011-01-26 11:13:50 【问题描述】:

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

【问题讨论】:

【参考方案1】:

是的:使用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 您如何删除该项目,您可以在这里发布您的完整代码吗?【参考方案2】:

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&lt;Integer&gt;而不是ArrayList&lt;Integer&gt;【参考方案3】:

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

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

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

【讨论】:

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

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

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

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

【讨论】:

我相信你想把它链接到codereply.com/answer/6i5bur/java-dynamic-arrays.html 我不确定 ArrayList 是否有我在 Java8 源代码中看到的任何 put 方法。只是试图找出它在给定容量下的表现。但是找到了 ArrayList.add() 方法。【参考方案5】:
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]);
    



来源:How to make dynamic array

【讨论】:

【参考方案6】:

    建议使用List来处理小规模大小。

    如果您有大量数字,切勿使用列表和自动装箱,

    列表列表

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

int[] array = new int[ESTIMATED_SIZE];

【讨论】:

【参考方案7】:

改用List 怎么样?例如ArrayList&lt;integer&gt;

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

【参考方案9】:

我回答了这个问题,不,你不需要数组列表或任何其他东西,这是一项任务,我完成了它,所以是的,数组可以增加大小。链接在这里 How to use Java Dynamic Array 这是我回答的问题的链接 Java Dynamic arrays

【讨论】:

这是错误的。链接的答案调用 System.arrayCopy(),将旧数组复制到一个大小增加的新数组中,然后添加新条目。数组仍然不能有动态大小。

以上是关于Java中的可变长度(动态)数组的主要内容,如果未能解决你的问题,请参考以下文章

java 可变长度参数

Java实现长度可变数组

Java判断回文语句的程序(可变参数,String转化为char数组)

使用可变长度数组是不是安全?

使用可变长度数组是不是有任何开销?

Java 我在学反射的时候,遇到可变长度参数列表,具体的成员方法就是?