> 文章列表 > JAVA中,ArrayList 的扩容机制,含案例

JAVA中,ArrayList 的扩容机制,含案例

JAVA中,ArrayList 的扩容机制,含案例

JAVA中,ArrayList 的扩容机制,含案例

在 Java 中,ArrayList 是一个动态数组,它可以根据需要自动增长。当 ArrayList 中的元素数量超过其初始容量时,它会重新分配一个更大的内部数组,然后将现有元素复制到新数组中。这个过程称为扩容。

ArrayList 的扩容机制基于以下几个因素:

  1. ArrayList 对象的初始容量。
  2. ArrayList 对象中的元素数量。
  3. ArrayList 对象的增长因子。

ArrayList 中的元素数量超过初始容量时,ArrayList 将创建一个新的内部数组,并将其大小设置为当前容量的增长因子倍数。默认情况下,增长因子是 1.5,这意味着每次扩容时,ArrayList 的容量将增加原始容量的 1.5 倍。

下面是一个 ArrayList 扩容的示例代码:

javaCopy codeimport java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>(2); // 初始容量为 2list.add("apple");list.add("banana");list.add("orange"); // 当添加第三个元素时,容量将自动扩展System.out.println("Size: " + list.size()); // 打印 ArrayList 大小System.out.println("Capacity: " + getCapacity(list)); // 打印 ArrayList 容量}public static int getCapacity(ArrayList<?> list) throws Exception {java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData");field.setAccessible(true);return ((Object[]) field.get(list)).length;}
}

在上面的示例中,我们创建了一个 ArrayList 对象,并将其初始容量设置为 2。我们添加了三个元素到列表中,当添加第三个元素时,ArrayList 会自动扩容。在打印出列表的大小和容量后,我们可以使用反射 API 获取内部数组的长度,从而确定实际容量。

需要注意的是,ArrayList 的扩容机制可能会影响性能。当 ArrayList 扩容时,它需要重新分配内部数组并复制所有元素,这可能是一个开销较大的操作。为了避免不必要的扩容,可以通过初始化 ArrayList 时设置一个更大的初始容量,或者在添加大量元素之前,先调用 ensureCapacity 方法,手动设置 ArrayList 的容量。

在 Java 中,ArrayList 是一个动态数组,它可以根据需要自动增长。当 ArrayList 中的元素数量超过其初始容量时,它会重新分配一个更大的内部数组,然后将现有元素复制到新数组中。这个过程称为扩容。

ArrayList 的扩容机制基于以下几个因素:

  1. ArrayList 对象的初始容量。
  2. ArrayList 对象中的元素数量。
  3. ArrayList 对象的增长因子。

ArrayList 中的元素数量超过初始容量时,ArrayList 将创建一个新的内部数组,并将其大小设置为当前容量的增长因子倍数。默认情况下,增长因子是 1.5,这意味着每次扩容时,ArrayList 的容量将增加原始容量的 1.5 倍。

下面是一个 ArrayList 扩容的示例代码:

javaCopy codeimport java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>(2); // 初始容量为 2list.add("apple");list.add("banana");list.add("orange"); // 当添加第三个元素时,容量将自动扩展System.out.println("Size: " + list.size()); // 打印 ArrayList 大小System.out.println("Capacity: " + getCapacity(list)); // 打印 ArrayList 容量}public static int getCapacity(ArrayList<?> list) throws Exception {java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData");field.setAccessible(true);return ((Object[]) field.get(list)).length;}
}

在上面的示例中,我们创建了一个 ArrayList 对象,并将其初始容量设置为 2。我们添加了三个元素到列表中,当添加第三个元素时,ArrayList 会自动扩容。在打印出列表的大小和容量后,我们可以使用反射 API 获取内部数组的长度,从而确定实际容量。

需要注意的是,ArrayList 的扩容机制可能会影响性能。当 ArrayList 扩容时,它需要重新分配内部数组并复制所有元素,这可能是一个开销较大的操作。为了避免不必要的扩容,可以通过初始化 ArrayList 时设置一个更大的初始容量,或者在添加大量元素之前,先调用 ensureCapacity 方法,手动设置 ArrayList 的容量。