当我将列表转换为队列并轮询时,原始列表的大小是否会减小?

Does the original list decrease in size when I convert a list to a queue and poll?

提问人:user9341578 提问时间:7/22/2023 最后编辑:Federico klez Cullocauser9341578 更新时间:7/22/2023 访问量:49

问:

假设我有一个数组列表,例如

List<Integer> list = [1,2,3,4]; // ignore the syntax here

然后,我将集合转换为队列

Queue<Integer> queue = new LinkedList(list);

然后我做到了

queue.poll(); // remove element from queue

原始列表的大小是否也减小了,仅仅因为队列和列表都引用了相同的整数集合?

我原以为之后,然后的大小也会变小,但事实并非如此。这是否意味着队列和列表是内存中的不同数据集?queue.poll()list.size()

Java ArrayList 队列 按引用传递 内存地址

评论


答:

0赞 Elliott Frisch 7/22/2023 #1

Queue<Integer> queue = new LinkedList<>(list);(请不要使用 RAW 类型)创建原始集合的副本。所以不。从中删除元素不会修改 。它们确实引用了内存中的不同区域。这与操作相同queuelist

Queue<Integer> queue = new LinkedList<>();
queue.addAll(list);

另外,我知道你说忽略它,但是

List<Integer> list = [1,2,3,4];

应该是

List<Integer> list = List.of(1, 2, 3, 4);
0赞 Federico klez Culloca 7/22/2023 #2

它们可能指向相同的元素,但它们是不同的容器。该列表不支持。对元素的引用将从列表复制到队列,但如果从队列中删除某些内容,则它不应该(也不会)反映在列表中。Queue

特别是,构造函数如下所示LinkedList

public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
}

反过来,该方法如下所示(在调用自身的版本并提供大小之后):addAll

public boolean addAll(int index, Collection<? extends E> c) {
    // omitted for brevity

    Object[] a = c.toArray();

    // omitted for brevity

    for (Object o : a) {
        @SuppressWarnings("unchecked") E e = (E) o;
        Node<E> newNode = new Node<>(pred, e, null);
        if (pred == null)
            first = newNode;
        else
            pred.next = newNode;
        pred = newNode;
    }

    // omitted for brevity
}

(其中 是链表的第一个节点)first

因此,正如您所看到的,它创建了自己的节点。所以,是的,如果你删除了这些节点中的任何一个,你就不会从原始列表中删除任何内容。

评论

0赞 user9341578 7/22/2023
感谢您的详细解释!