提问人:user9341578 提问时间:7/22/2023 最后编辑:Federico klez Cullocauser9341578 更新时间:7/22/2023 访问量:49
当我将列表转换为队列并轮询时,原始列表的大小是否会减小?
Does the original list decrease in size when I convert a list to a queue and poll?
问:
假设我有一个数组列表,例如
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()
答:
0赞
Elliott Frisch
7/22/2023
#1
Queue<Integer> queue = new LinkedList<>(list);
(请不要使用 RAW 类型)创建原始集合的副本。所以不。从中删除元素不会修改 。它们确实引用了内存中的不同区域。这与操作相同queue
list
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
感谢您的详细解释!
评论