【问题标题】:How do Backed Collections work in Java?支持集合如何在 Java 中工作?
【发布时间】:2014-11-14 17:56:57
【问题描述】:

在 Java 中,我有以下数组 'integerArray' 并向其中添加 2 个整数。

Integer[] integerArray = new Integer[3];
integerArray[0] = 1;
integerArray[1] = 2;

现在我从数组中创建一个列表。

List<Integer> integerList = Arrays.asList(integerArray);

此时,'integerList' 包含 1 和 2。

现在我向数组中添加另一个元素。

integerArray[2] = 3;

此时,如果我们检查 integerList,我们会看到它包含 1,2,3;

使用什么机制可以使对 Array 的任何更改也反映在 List 中?一个简单的实现或示例会很有帮助。

【问题讨论】:

    标签: java arrays list


    【解决方案1】:

    返回一个由指定数组支持的固定大小的列表

    这意味着返回的列表对象,实际上是一个ArrayList,有一个对数组的引用,而不是一个副本。由于它引用了这个数组,所以对它的任何更改都会反映在列表中。

    方法Arrays.asList只是调用ArrayList的构造函数,定义如下:

    ArrayList (E[] array) {
        if (array == null)
            throw new NullPointerException();
        a = array;
    }
    

    因此,a 字段将存储对您的初始数组的引用。

    【讨论】:

      【解决方案2】:

      这是因为它是同一个变量,但用作列表。如果您阅读 Arrays.asList() 的 Javadoc

      上面写的很清楚

      返回由指定数组支持的固定大小的列表。 (更改返回的列表“直写”到数组。)此方法与 Collection.toArray() 结合,充当基于数组和基于集合的 API 之间的桥梁。返回的列表是可序列化的,并实现了 RandomAccess。

      【讨论】:

        【解决方案3】:

        Arrays.asList 是一个静态/实用方法,它调用构造函数来创建一个新的 ArrayList。 ArrayList 由 Array 支持。在许多编程语言中都是这种情况,其中高级数据结构只是由原始数组支持。可以看这里的源码Arrays.asList

        【讨论】:

          猜你喜欢
          • 2011-04-07
          • 1970-01-01
          • 1970-01-01
          • 2012-11-11
          • 1970-01-01
          • 2012-07-23
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          相关资源
          最近更新 更多