当前位置: 首页 > 面试题库 >

为什么在java.util.Arrays中有一个ArrayList声明

壤驷旭
2023-03-14
问题内容

在JDK 1.7中,存在一个ArrayList声明asList

他们为什么要制造新的private static class而不使用java.util.ArrayList

@SafeVarargs
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

/**
 * @serial include
 */
private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable
{
    private static final long serialVersionUID = -2764017481108945198L;
    private final E[] a;

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

    public int size() {
        return a.length;
    }

    public Object[] toArray() {
        return a.clone();
    }

    public <T> T[] toArray(T[] a) {
        int size = size();
        if (a.length < size)
            return Arrays.copyOf(this.a, size,
                                 (Class<? extends T[]>) a.getClass());
        System.arraycopy(this.a, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

    public E get(int index) {
        return a[index];
    }

    public E set(int index, E element) {
        E oldValue = a[index];
        a[index] = element;
        return oldValue;
    }

    public int indexOf(Object o) {
        if (o==null) {
            for (int i=0; i<a.length; i++)
                if (a[i]==null)
                    return i;
        } else {
            for (int i=0; i<a.length; i++)
                if (o.equals(a[i]))
                    return i;
        }
        return -1;
    }

    public boolean contains(Object o) {
        return indexOf(o) != -1;
    }
}

问题答案:

因为List通过返回Arrays.asList()
后盾 给定的数组。它包装该数组;数组的更改反映在中List,反之亦然。

另外,因此,List返回的此处具有固定大小。因此,它不能是ArrayList因为ArrayList可以增长或收缩。



 类似资料:
  • 问题内容: 我想知道java集合API中上述两者之间的实际区别是什么。我是Java Collections API的新手。我知道List是ArrayList类实现的接口。 问题答案: 在你的声明1,因为你是指因为虽然它仍然是, 因此你可以使用在可用的方法唯一接口。如果您正在使用跨class.method功能,这是更好的声明。 同样,任何接受方法都可以接受任何实现类,例如或您的自定义实现类。 您的第

  • 问题内容: 为什么下面的代码抛出ConcurrentModificationException?JoshBloch可以避免ConcurrentModificationException。 问题答案: 使用“ for each”循环时,不能在列表上使用remove。相反,您可以使用此方法在迭代器上调用remove: 如果您实际上想用“ 200”代替每个值,或用其他值代替,则建立一个新列表可能更有意义

  • 约书亚·布洛赫在高效的Java中写道: 请注意,非零长度数组总是可变的,因此类具有公共静态最终数组字段或返回此类字段的访问器是错误的。如果类具有这样的字段或访问器,客户端将能够修改数组的内容。这是安全漏洞的常见来源: 请注意,许多IDE生成的访问器会返回对私有数组字段的引用,这恰恰导致了这个问题。有两种方法可以解决这个问题。您可以将公共数组设为私有,并添加公共不可变列表: 或者,可以将数组设为私有

  • 问题内容: 我正在尝试将名为 City 的 类的 对象添加到中。这是该类的代码 __ 这是我的 主班 的代码 __ 的结果始终相同,并且似乎 数组列表 仅存储添加到其所有元素中的最后一个对象。 例如,运行程序时得到的结果是: 为什么我得到那个结果?我该如何解决? 提前致谢! 问题答案: 在和变量被标记为。甲构件跨过的所有实例共享,并且因此是一个全局变量。您需要对代码进行几处更改: 将city中的和

  • 问题内容: 如果语言设计者仅使用Enum 会对语言产生怎样的影响? 现在唯一的区别是有人会写 A扩展 但由于Java中不允许扩展枚举,因此仍然是非法的。我也在考虑为jvm提供一个字节码,该字节码将smth定义为扩展枚举-但是泛型不会受到影响,因为它们都被删除了。 那么,声明的重点是什么? 谢谢! 编辑 为简单起见,让我们来看一个例子: 这个类结构有什么问题?限制可以做什么? 问题答案: 这是一个普

  • 问题内容: 当我得知该类在Java中被声明为final时,我想知道为什么会这样。那时我没有找到任何答案,但是这篇文章:如何在Java中创建String类的副本?让我想起了我的疑问。 当然,String提供了我所需要的所有功能,而且我从未想过需要扩展String类的任何操作,但是您仍然永远不会知道有人可能需要什么! 那么,有谁知道设计师决定将其定稿时的意图是什么? 问题答案: 将字符串实现为不可变对