Java非静态数组

时间:2012-04-03 06:00:32

标签: java arrays

我必须在java中找到动态数组。我知道我可以使用 ArrayList 列表,但我现在无法使用它们,我真的很努力找到这个,但我找不到如何使用非静态(动态)数组没有收藏,谢谢

7 个答案:

答案 0 :(得分:6)

数组在Java中具有固定长度。没有办法解决这个问题。

如果您想将N:th元素添加到数组,arr长度为N-1,那么您必须

  1. 创建一个新阵列。
  2. 将旧数组的内容复制到新数组
  3. 用对on new的引用替换对旧数组的所有引用。
  4. 在代码中,这些步骤对应于

    int[] newArr = new int[N];
    System.arraycopy(arr, 0, newArr, 0, arr.length);
    arr = newArr;
    

    或者,使用Java 6中的Arrays.copyOf稍微缩短:

    int[] newArr = Arrays.copyOf(arr, N);
    arr = newArr;
    

答案 1 :(得分:1)

Java中的普通数组不是动态的,因此当您想要更改数组的大小时,需要创建一个新数组并将前一个数据的内容复制到其中。

您可以使用Arrays#copyOf方法以简单的方式创建和复制它:

int[] myNewIntArray = Arrays.copyOf(oldIntArray, newArraySize);

答案 2 :(得分:1)

您可以实现自己的动态数组。创建一个大小为1的数组(如果提供了初始大小,则为n),然后将大小加倍并在现有元素达到容量后复制它们。

这将使每次操作的摊销成本为3,n元素为3n,这意味着你可以在o(n)时间内保持这个成本。

一个非常简单的天真实现(对于int数组)将是:

class DynamicIntArray
{
    private int capacity;
    private int[] array;
    private int size = 0;

    public DynamicIntArray()
    {
        this(1);
    }

    public DynamicIntArray(int capacity)
    {
        this.capacity = capacity;
        array = new int[this.capacity];
    }

    public void add(int a)
    {
        if (size == capacity)
            resize();
        array[size] = a;
        size++;
    }

    private void resize()
    {
        capacity *= 2;
        array = Arrays.copyOf(array, capacity);
    }

    // Implement the rest
}

以下是您将如何使用它:

DynamicIntArray dynamicArray = new DynamicIntArray();
dynamicArray.add(1);
dynamicArray.add(2);
dynamicArray.add(3);

如果将其更改为使用泛型,则可以将其用于任何内容,而不仅仅是整数。

答案 3 :(得分:0)

你只需像这样分配它们:

int[] array = new int[17];

答案 4 :(得分:0)

您可以使用Collection直到需要类型数组,然后使用Collection.toArray()函数获取数组。

答案 5 :(得分:0)

您可以通过在接近完整时创建新数组来模仿动态行为,例如,创建一个长度是原始数组长度两倍的新数组,并复制所有元素。

答案 6 :(得分:0)

如果你解释一下你想要做什么以及为什么你不能/不会用户收藏,我想你会得到更好的答案。你想要解决的问题究竟是什么?