是否有像Array这样的List?

时间:2013-12-15 15:11:41

标签: java arrays list

是否有类似List的类似数组? 我希望能够预定义List的绝对大小,因此如果我得到一个值,那么未在其中定义但其索引位于大小的所有内容应为null。我还想覆盖空值,如果我使用add()方法就像已经实现的那样,或者我是否必须自己制作?

我已经尝试了ArrayList s,但是如果我得到的索引值I小于容量但不小于该值,则会抛出IndexOutOfBoundsException

8 个答案:

答案 0 :(得分:1)

据推测,这种结构有一些用途,需要它是List而不是数组。

最像表现形式的结构是数组。使用它,但在需要结构的List视图的上下文中,使用Arrays.asList。

答案 1 :(得分:1)

是的,由于您的特殊要求,您确实需要自己的实施:get超出当前大小并返回null。普通数组和任何List实现都没有这样的语义。

您需要与ArrayList非常相似的内容,因此从中扩展可能需要付费,覆盖get以更改sizecapacity之间的索引行为。< / p>

您也可以选择从AbstractList开始,这将通过实施所有List接口方法来帮助您,这些接口方法可以根据基本操作的核心子集进行定义。

答案 2 :(得分:1)

您似乎需要一个类似JavaScript的数组。你可以做的是从ArrayList派生,重载容量构造函数,如果index大于一个大小,则返回null:

static class JSLikeArray<E> extends ArrayList<E> {
    public JSLikeArray(int initialCapacity) {
        super(initialCapacity);
    }

    @Override
    public E get(int index) {
        if (index >= size()) return null;

        return super.get(index);
    }

    @Override
    public E set(int index, E element) {
        int l = index + 1;
        for (int i = size(); i < l; i++) {
            add(null);
        }

        super.set(index, element);

        return element;
    }
}

public static void main(String[] args) {
    JSLikeArray<Integer> array = new JSLikeArray<Integer>(10);

    array.set(3, 3);

    System.out.println("array before add: " + array);
    System.out.println("array.get(10): " + array.get(10));
    array.add(4);
    System.out.println("array after add: " + array);
}

打印:

array before add: [null, null, null, 3]
array.get(10): null
array after add:  [null, null, null, 3, 4]

答案 3 :(得分:0)

ArrayList<String> a = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
    a.add(i, null);
}
a.add(5, "string");

这将创建一个大小为20的ArrayList,其中包含null个。方法add(int index, String element)确实使用给定元素更新给定索引上的null

但是,您不能再使用简单的add(String)方法,因为这只会添加第21个(依此类推)元素。我认为你不能告诉List不再接受价值观。这就是为什么创建它们的原因,这样你就可以为它添加值而不必关心它们的大小...

但是,您可以扩展ArrayList类,设置其大小并在其构造函数中预先填充null,并覆盖add(String)方法以执行任何操作或类似的操作。 ..

答案 4 :(得分:0)

  

“我已经尝试过ArrayLists,但是如果我得到索引i的值小于容量,但不小于大小,则抛出IndexOutOfBoundsException ..”

尺寸和容量是两个完全不同的东西。 size是列表中元素的实际数量,而容量如果内存容量可用,直到它必须在引擎盖下调整大小

因此,如果您有容量10和大小4,那么您可以访问的最大索引是3。

首次初始化列表时,大小为0.每次添加时,大小都会增加1,而不是容量。

请记住,arraylist是一个阵列。容量是数组大小,即new int[10];。但即使数组大小为10,实际列表也不是。 10是列表的容量。达到容量时,阵列的大小会增加,从而增加列表的容量。

答案 5 :(得分:0)

你应该创建一个自己的类class Array并将所有功能初始化为你想要的。在您的情况下,这将是最好的解决方案。

答案 6 :(得分:0)

当您在边界之外添加索引时,您不使用列表。这是一个适合数组的要求。

最后我从阅读中得到了你想要一个List就像一个数组。为此,您必须触摸ArrayList实现。如果添加新元素超过列表的当前容量,则对其进行子类化并覆盖calles确保容量的每个方法,以便增加列表。

只需覆盖ensureCapacity并禁用它,抛出UnsupportedOperationException。然后,您还需要通过覆盖和抛出不支持的操作异常来禁用删除操作。

你甚至可能想要覆盖......所以你看到很多事情要做。

另一个简单的想法是使用HashMap。将整数存储到对象。如果integer超出范围,您只需在put操作中抛出IndexOutOfBoundsException。当得到的索引不在地图中时,无论如何都会返回null。

这很好,但我不会这样。

最后只是扭曲一个数组。使用Array.fill填充空值,因为在sepcs中它可能是随机的,但我看到它的每个实现总是被淘汰,否则JVM可能会破坏,因为随机内容可能被解释为引用。

所以让我们创建一个新的。您可以实现Collection接口甚至List接口,但最终可能只想在每个循环中使用它(对于element:list)。因此,您需要做的就是实现Iterable接口。

新类应该有set(int index,T object)和T get(int index)以及int size()。就这样。


底线:

没有列表不是你想要的。创建自己的实现包装数组。实现Iterable,如果你喜欢Collection,那么你很高兴。

答案 7 :(得分:0)

使用

List<MyObject> list = Arrays.asList(new MyObject[SIZE]);

这将创建一个由指定大小的数组支持的List,预先填充空值。此列表是可变的,但具有固定的大小。您可以使用set更改特定位置的值,但addremove会抛出异常。此外,ListCollection API的其余部分将用于阅读和迭代,这可能是您的意图。