gpt4 book ai didi

java - ArrayList 在 Java Collection Framework 内部是如何表示的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:35 26 4
gpt4 key购买 nike

我正在听 Robert Sedgewick 在 Coursera 上的算法讲座。当 Robert 先生指出不能将泛型与数组一起使用时,我有点困惑,因为这是不允许的。但是 Collection Framework 中的 ArrayList 在内部使用 Arrays 并且允许使用 Generic 数据类型。我的意思是说我们可以执行以下操作:

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

他指出的一个 hack 是这样的:

public class FixedCapacityStack<Item>{
private Item[] s;
private int N = 0;

public FixedCapacityStack(int capacity)
{ s = (Item[]) new Object[capacity];} //this hack

他还提到这是一个丑陋的 hack,必须避免,它还会在编译期间产生警告。

我的问题是:

1.) ArrayList 如何在内部表示各种泛型类型?

2.) 如果(假设)他们使用了上面提到的 hack,为什么当我们使用 ArrayList 编译程序时它不产生警告?

3.) 除了上面的转换之外还有更好的方法吗?

最佳答案

根据来源:

1 - ArrayList 将项目存储在 Object[] 中,并在检索单个元素时转换值。实际上有一个 @SuppressWarnings("unchecked") 发生转换的地方。

2 - 这里有两个答案 - 第一个是你不是(通常)编译 ArrayList,而是只是将它从 rt.jar 包含在你的类路径中JRE/JDK。第二个是 ArrayList 在从 Object 到泛型类型的未经检查的转换中使用了 @SuppressWarnings

3 - 你的另一个选择(“更好”是相当主观的)将要求 Class 为你的通用类型,并使用 Array.newInstance(Class clazz, int capacity) 创建您的数组,如 this question 中所述

关于java - ArrayList 在 Java Collection Framework 内部是如何表示的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29394408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com