java基础-数组扩容详解

  

Java基础-数组扩容详解

什么是数组扩容

在Java中,数组是一个固定长度的数据结构。当我们在使用数组时,如果需要添加更多的元素,则需要声明一个新的数组并复制所有旧元素到新数组中。这个过程称为“数组扩容”。

在Java中,数组扩容是自动完成的。当我们向一个已经装满元素的数组中添加新元素时,系统会自动创建一个新的数组,并将旧元素复制到新数组中。这个过程对用户来说是透明的,我们只需要向数组中添加元素,系统就会自动完成数组扩容。

数组扩容的机制

数组扩容是一个相对复杂的过程,需要考虑多种情况,如何优化扩容过程。Java中的数组扩容机制主要分为以下两步:

  1. 创建一个新的数组,长度大于等于老数组的长度。

  2. 将旧数组中的元素复制到新数组中,并释放旧数组。

在Java 6和以下版本中,数组扩容的算法是每次将长度增加 50%。例如:如果旧数组长度为10,那么新数组的长度为15。

在Java 7及以上版本中,数组扩容采用的是每次将长度增加 1/2。 例如,如果旧数组长度为10,新数组的长度将会是15,然后再扩充为22,以此类推。

数组扩容的性能

数组扩容过程对系统内存会有一定的影响,因为扩容会消耗内存,特别是当我们需要扩容的数组很大的时候。因此,我们应该尽量减少数组扩容的次数。

一种有效的方法是,在创建数组时就分配足够的空间,以满足后续的数据添加。这样可以避免不必要的数组扩容过程,提高程序的效率。此外,我们还可以使用集合类代替数组,因为集合类可以自动扩容,更加灵活。

示例

以下代码展示了数组扩容的例子:

public class ArrayExpansionDemo {
    public static void main(String[] args) {
        // 初始化一个大小为5的数组
        int[] oldArray = new int[5];
        for (int i = 0; i < oldArray.length; i++) {
            oldArray[i] = i;
        }

        // 将数组长度扩大到10
        int[] newArray = new int[10];
        System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
        oldArray = newArray;

        // 在新数组中添加5个元素
        for (int i = 5; i < oldArray.length; i++) {
            oldArray[i] = i;
        }

        // 输出新数组内容
        for (int i = 0; i < oldArray.length; i++) {
            System.out.print(oldArray[i] + " ");
        }
    }
}

输出结果为:

0 1 2 3 4 5 6 7 8 9

以上代码中,我们首先创建了一个大小为5的数组,并将前5个元素初始化。然后,我们将该数组扩展到大小为10,并在新数组中添加5个元素。最后,我们输出新数组的所有元素。

以下代码展示了ArrayList自动扩容的例子:

public class ArrayListExpansionDemo {
    public static void main(String[] args) {
        // 创建一个ArrayList对象
        ArrayList<Integer> numbers = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            numbers.add(i);
        }
        // 输出ArrayList对象所有元素
        for (int i = 0; i < numbers.size(); i++) {
            System.out.print(numbers.get(i) + " ");
        }
    }
}

输出结果为:

0 1 2 3 4 5 6 7 8 9

以上代码中,我们创建了一个ArrayList对象,并将前10个整数添加到ArrayList对象中。由于ArrayList对象可以自动扩容,我们无需担心元素数量过多而导致的数组扩容问题。最后,我们输出ArrayList对象的所有元素。

相关文章