Java LinkedList工作原理及实现(一)
2016-05-12 14:03
591 查看
目录
1. 概述2. set和get函数
参考资料
1. 概述
以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作。按下标访问元素—get(i)/set(i,e) 要悲剧的遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起)。
插入、删除元素时修改前后节点的指针即可,但还是要遍历部分链表的指针才能移动到下标所指的位置,只有在链表两头的操作—add(), addFirst(),removeLast()或用iterator()上的remove()能省掉指针的移动。
LinkedList是一个简单的数据结构,与ArrayList不同的是,他是基于链表实现的。
Doubly-linked list implementation of the List and Deque interfaces. Implements all optional list operations, and permits all elements (including null).
LinkedList<String> list = new LinkedList<String>(); list.add("语文: 1"); list.add("数学: 2"); list.add("英语: 3");
结构也相对简单一些,如下图所示:
2. set和get函数
public E set(int index, E element) { checkElementIndex(index); Node<E> x = node(index); E oldVal = x.item; x.item = element; return oldVal; } public E get(int index) { checkElementIndex(index); return node(index).item; }
这两个函数都调用了
node函数,该函数会以O(n/2)的性能去获取一个节点,具体实现如下所示:
Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }
就是判断index是在前半区间还是后半区间,如果在前半区间就从head搜索,而在后半区间就从tail搜索。而不是一直从头到尾的搜索。如此设计,将节点访问的复杂度由O(n)变为O(n/2)。
参考资料
LinkedList (Java Platform SE 8)相关文章推荐
- Java中的迭代与递归
- Struts2 的输入验证
- eclipse如何从一个复杂得方法中提取一小段代码到新的方法上(重构方式之一)
- Eclipse中找不到such setBillType(Ljava/lang/String;)V
- Spring的事务管理机制
- java过来emoji手机表情,mysql入库
- Java开发常用的在线工具
- SpringMVC @ResponseBody 415错误处理
- <context:component-scan>使用说明
- spring事务配置详解
- 深入分析 Java 中的中文编码问题
- JDK、JRE、JVM三者间的关系
- struts2 国际化 中文乱码英文不乱码问题
- java使double保留两位小数的多方法 java保留两位小数
- 深入理解Java的接口和抽象类
- Spring学习笔记之---注解的使用
- JAVA随机数之多种方法从给定范围内随机N个不重复数
- 【JAVA】运算符与逻辑运算符
- SpringMVC 处理过程
- Java学习笔记(八):集合类