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

问题描述 投票:0回答:8

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

java arrays dynamic arraylist
8个回答
133
投票

是:使用ArrayList

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

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

需要注意的是:ArrayList 只能保存对象(例如整数),而不能保存基元(例如整数)。在大多数情况下,自动装箱/自动拆箱会默默地为你处理这个问题,但根据你正在做的事情,你可能会得到一些奇怪的行为。


42
投票

Java 中的数组是固定大小的。您需要的是 ArrayList,它是 Java 中提供的许多极其有价值的集合之一。

而不是

Integer[] ints = new Integer[x]

你使用

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

然后要更改列表,您可以使用

ints.add(y)
ints.remove(z)
以及许多其他方便的方法,您可以在相应的 Javadocs 中找到。

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


27
投票

数组一旦实例化,大小就固定。您可以使用列表代替。

自动装箱使列表像数组一样可用,您可以简单地将 int 值放入其中:

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

12
投票

我不同意之前建议

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

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

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


7
投票
  1. 建议使用List来处理小尺寸。

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

    列表< Integer>列表

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

int[] array = new int[ESTIMATED_SIZE];

4
投票

使用

List
来代替怎么样?例如,
ArrayList<integer>


4
投票

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

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

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


0
投票
class Main {



public static void main(String[] args) {

    int [] a={1, 0, 3, 4, 1, 2, 0, 4};

    int count =1;

    int [] temp = null;

    for(int r : a)
    {
        if(r!=0)
        {

            if(temp==null || count >= temp.length)
            {
                temp =dynamicincrement(count,temp);
            }
            temp[count-1] = r;
            count=count+1;
        }
    }

    System.out.println("the value"+Arrays.toString(temp));
}

public static  int [] dynamicincrement(int size,int [] existingdata)
{

    int [] trf=new int [size];
    if(existingdata==null)
    {
        return new int[size];
    }

    if( existingdata!=null  &&  existingdata.length>0)
    {
        for(int i=0;i<existingdata.length;i++)
        {
            trf[i]=existingdata[i];
        }
    }


    return trf;
}

}

© www.soinside.com 2019 - 2024. All rights reserved.