首页 > 解决方案 > arraylist 如何在内部使用数组存储不同的数据类型

问题描述

arraylist 如何在内部使用数组存储不同的数据类型。由于数组是数组列表的内部实现,并且在数组中我们只能存储类似的数据类型,如字符串/整数等。

想了解 arraylist 的内部实现,用于处理多种数据类型的数据。

我的问题实际上是:在列表中,我们可以添加整数、字符串、布尔值等任何内容,但在内部它是由数组实现的。那么数组如何将不同类型的包装器处理成同一个数组对象。

标签: javaarraylistinternals

解决方案


ArrayList 总是需要对象将其存储在列表中,它使用泛型为特定类型创建列表。例如:

ArrayList<Integer> intList = new ArrayList<>();

这为 Integer 类型创建了一个 arraylist,这里 Integer 是原始数据类型 int 的包装类,我们不能创建原始类型的 arraylist,我们需要使用包装类。如果您不使用泛型,那么:

ArrayList<> intList = new ArrayList<>();

默认情况下,它是为 Object 类创建的,它是所有类的超类,包括包装器类。现在:

ArrayList a = new ArrayList<>();
a.add(1);

在这里,我们创建了一个对象的数组列表,但是添加了 1 个原始整数,它仍然有效,因为它被转换为 Integer 包装器,而 Object 是 Integer 包装器类的超类。所以如果你写:

Object ab = new Object();
ab=1;

这是有效的。因此,当您将 1 添加到数组列表中时,您的原始 1 将转换为 Object 类引用的 Integer 包装器类。

我希望这能简化你。

除了您的评论之外,在 ArrayList 类源代码中,您可以看到存储所有元素的数组不过是:

 /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer. Any
     * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
     * will be expanded to DEFAULT_CAPACITY when the first element is added.
     */
    transient Object[] elementData; // non-private to simplify nested class access

这是一个 Object 类的数组。因此它可以存储任何对象,并且由于 ArrayList 类实现了泛型,如果 ArrayList 是使用特定类型创建的,则很容易将此对象转换为特定类型。


推荐阅读