将List转为Queue并调用poll()后,原List的大小会减少吗?
问题
假设我有如下ArrayList:
List<Integer> list = [1,2,3,4]; // 忽略此处语法
随后将该集合转换为队列:
Queue<Integer> queue = new LinkedList(list);
接着执行:
queue.poll(); // 从队列中移除元素
仅因两者引用同一Integer集合,原List的大小也会减少吗?我原本以为调用queue.poll()后,list.size()会变小,但实际并非如此,这是否意味着队列和列表在内存中是不同的数据集?
回答
这是因为LinkedList(Collection<? extends E> c)构造方法会复制传入集合中的所有元素,创建一个全新的LinkedList实例——它和原ArrayList是完全独立的两个集合对象,内存中存储的是各自的数据集。
- 原ArrayList的元素和LinkedList中的元素虽然是同一个Integer对象(Integer是不可变类型,小数值会复用缓存),但两个集合本身是独立的容器,各自维护自己的元素引用列表。
- 调用
queue.poll()只会修改LinkedList内部的元素引用结构,不会对原ArrayList产生任何影响,所以原List的大小不会变化。
内容的提问来源于stack exchange,提问作者user9341578
相关产品推荐
相关产品推荐

