做网站水印,WordPress语音朗读插件,wordpress代码中文注释,网站建设 方案下载目录
一、LinkedList的全面说明
二、LinkedList的底层操作机制
(一)LinkedList添加结点源码
(二)LinkedList删除结点源码
三、LinkedList常用方法
四、ArrayList与LinkedList的选择 一、LinkedList的全面说明 LinkedList底层实现了双向链表和双端队列的特点可以添加任意…目录
一、LinkedList的全面说明
二、LinkedList的底层操作机制
(一)LinkedList添加结点源码
(二)LinkedList删除结点源码
三、LinkedList常用方法
四、ArrayList与LinkedList的选择 一、LinkedList的全面说明 LinkedList底层实现了双向链表和双端队列的特点可以添加任意元素(元素可以重复)包括null线程不安全没有实现同步和互斥 二、LinkedList的底层操作机制 LinkedList底层维护了一个双向链表LinkedList中维护了两个属性first和last分别指向首节点和尾节点每个节点(Node对象)里面又维护了prev、next、item三个属性其中通过prev指向前一个通过next指向后一个节点。最终实现双向链表所以LinkedList元素的添加和删除不是通过数组完成的相对来说效率较高 (一)LinkedList添加结点源码
1. LinkedList linkedList new LinkedList();public LinkedList() {}
2. 这时 linkeList 的属性 first null last null
3. 执行 添加public boolean add(E e) {linkLast(e);return true;}
4.将新的结点加入到双向链表的最后void linkLast(E e) {final NodeE l last;final NodeE newNode new Node(l, e, null);last newNode;if (l null)first newNode;elsel.next newNode;size;modCount;}
(二)LinkedList删除结点源码
linkedList.remove(); // 这里默认删除的是第一个结点1. 执行 removeFirstpublic E remove() {return removeFirst();}
2. 执行public E removeFirst() {final NodeE f first;if (f null)throw new NoSuchElementException();return unlinkFirst(f);}
3. 执行 unlinkFirst, 将 f 指向的双向链表的第一个结点拿掉private E unlinkFirst(NodeE f) {// assert f first f ! null;final E element f.item;final NodeE next f.next;f.item null;f.next null; // help GCfirst next;if (next null)last null;elsenext.prev null;size--;modCount;return element;}
三、LinkedList常用方法 因为LinkedList也继承了Collection和List所以List的方法也适用于LinkedList。 add()remove() // 默认删除第一个结点removeFirst()removeLast()set(索引值,插入的元素)get(索引值) public static void main(String[] args) {LinkedList linkedList new LinkedList();linkedList.add(1);linkedList.add(2);linkedList.add(3);linkedList.add();linkedList.add( );linkedList.add( );linkedList.add(null);linkedList.add(null);System.out.println(linkedList linkedList);// linkedList[1, 2, 3, , , , null, null]// remove默认删除第一个结点linkedList.remove();System.out.println(linkedList linkedList);// linkedList[2, 3, , , , null, null]// 修改某个结点对象linkedList.set(1, 999);System.out.println(linkedList linkedList);// linkedList[2, 999, , , , null, null]// 得到某个结点对象// get(1) 是得到双向链表的第二个对象Object o linkedList.get(1);System.out.println(o); // 999// 因为LinkedList 是 实现了List接口, 遍历方式System.out.println(LinkeList遍历迭代器);Iterator iterator linkedList.iterator();while (iterator.hasNext()) {Object next iterator.next();System.out.println(next next);}// next2// next999// next// next// next// nextnull// nextnullSystem.out.println(LinkeList遍历增强for);for (Object o1 : linkedList) {System.out.println(o1 o1);}// next2// next999// next// next// next// nextnull// nextnullSystem.out.println(LinkeList遍历普通for);for (int i 0; i linkedList.size(); i) {System.out.println(linkedList.get(i));}// 2// 999//////// null// null
}
四、ArrayList与LinkedList的选择
底层结构增删的效率改查的效率ArrayList可变数组较低底层依赖数组扩容较高根据数组索引查找LinkedList双向链表较高底层通过链表追加较低在链表中从头到尾遍历 如何选择ArrayList与LinkedList 如果改查的操作多选择ArrayList如果增删的操作多选择LinkedList一般来说80%-90%都是查询因此大部分情况下会选择ArrayList根据业务灵活选择也可能一个模块使用的是ArrayList另一个模块使用LinkedList。