java - arraylist 如何在内部使用数组存储不同的数据类型
问题描述
arraylist 如何在内部使用数组存储不同的数据类型。由于数组是数组列表的内部实现,并且在数组中我们只能存储类似的数据类型,如字符串/整数等。
想了解 arraylist 的内部实现,用于处理多种数据类型的数据。
我的问题实际上是:在列表中,我们可以添加整数、字符串、布尔值等任何内容,但在内部它是由数组实现的。那么数组如何将不同类型的包装器处理成同一个数组对象。
解决方案
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 是使用特定类型创建的,则很容易将此对象转换为特定类型。
推荐阅读
- c - libCurl 函数 curl_easy_perform(cp) 导致段错误
- android - 警报对话框按钮没有为 on willPop 方法提供参数
- ios - 在没有大型 switch 语句的情况下处理 TCP 数据
- javascript - 如何防止用户嵌入自定义 HTML
- sql - 创建在两个表上运行的触发器
- python - 按组大小过滤数据框
- python - 单击在帐单地址表单提交会在登录时重定向我,而不是将我重定向到送货地址表单
- sql-server - SQL Server 可以提前查看 XML 标记和/或计算它们吗?
- node.js - 带有批处理请求的 Google Sheets API 更新格式
- python - python - 如何在python中实现具有多个条件的sumifs,包括日期范围?