Java 集合 LinkedList 需要知道的几个问题

问:请使用 LinkedList 模拟一个堆栈或队列的数据结构?

答:首先堆栈是先进后出,队列是先进先出,LinkedList 不但实现了 List 接口还实现了 Deque 双端队列接口,接着给出实现如下。

        public class Queue {
            private LinkedList link;

            public Queue() {
                link = new LinkedList();
            }

            public void push(Object obj) {
                link.addLast(obj);
            }

            public Object pop() {
                return link.removeFirst(); //队列
                // return link.removeLast(); //堆栈 
            }

            public boolean isEmpty() {
                return link.isEmpty();
            }
        }
问:谈谈你理解的 LinkedList 工作原理和实现?

答:LinkedList 是以双向链表实现,链表无容量限制(但是双向链表本身需要消耗额外的链表指针空间来操作),其内部主要成员为 first 和 last 两个 Node 节点,在每次修改列表时用来指引当前双向链表的首尾部位,所以 LinkedList 不仅仅实现了 List 接口,还实现了 Deque 双端队列接口(该接口是 Queue 队列的子接口),故 LinkedList 自动具备双端队列的特性,当我们使用下标方式调用列表的 get(index)、set(index, e) 方法时需要遍历链表将指针移动到位进行访问(会判断 index 是否大于链表长度的一半决定是首部遍历还是尾部遍历,访问的复杂度为 O(N/2)),无法像 ArrayList 那样进行随机访问。(如果 i> 数组大小的一半,会从末尾移起),只有在链表两头的操作(譬如 add()、addFirst()、removeLast() 或用在 iterator() 上的 remove() 操作)才不需要进行遍历寻找定位。

问:简单谈谈 ArrayList、LinkedList、List 的区别?

答:List 是集合列表接口,ArrayList 和 LinkedList 都是 List 接口的实现类。ArrayList 是动态数组顺序表,顺序表的存储地址是连续的,所以查找比较快,但是插入和删除时由于需要把其它的元素顺序移动,所以比较耗时。LinkedList 是双向链表的数据结构,同时实现了双端队列 Deque 接口,链表节点的存储地址是不连续的,每个存储地址通过指针关联,在查找时需要进行指针遍历节点,所以查找比较慢,而在插入和删除时比较快。

本文参考自
https://mp.weixin.qq.com/s/DzmqA8holtaJvJNJn4yR7Q

你可能感兴趣的:(Java 集合 LinkedList 需要知道的几个问题)