`
这些年
  • 浏览: 400384 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

zy19982004--容器学习八:LinkedList源码分析

 
阅读更多

一.概述

  1. LinkedList继承Deque,所以LinkedList的插入删除操作遵循先进性出FIFO。
  2. LinkedList继承Deque,所以Linkedist实现了Deque的操作,比喻offer peek pollfirst/last等操作。其实这些操作也就是建立在getFirst getLast addFirst addLast removeFirst removeLast这几个操作上的。

 

 .成员变量

Java代码  收藏代码
  1. //头节点  
  2. private transient Entry<E> header = new Entry<E>(nullnullnull);  
  3. private transient int size = 0;  

 

 .节点Entry对象

Java代码  收藏代码
  1. //节点  
  2. private static class Entry<E> {  
  3.     E element;           //当前节点存储的元素  
  4.     Entry<E> next;       //当前节点的下一个节点  
  5.     Entry<E> previous;   //当前节点的上一个节点  
  6.   
  7.     Entry(E element, Entry<E> next, Entry<E> previous) {  
  8.         this.element = element;  
  9.         this.next = next;  
  10.         this.previous = previous;  
  11.     }  
  12. }  

 

 四.构造函数

Java代码  收藏代码
  1. //初始化  
  2. public LinkedList() {  
  3.     header.next = header.previous = header;  
  4. }  

 

 .存数据

Java代码  收藏代码
  1. //默认插入到最后  
  2. public boolean add(E e) {  
  3.     addBefore(e, header);  
  4.     return true;  
  5. }  
  6.   
  7. //把元素e插入最前  
  8. public void addFirst(E e) {  
  9.     //等价于把元素e插入到原第一个节点header.next的前面  
  10.     addBefore(e, header.next);  
  11. }  
  12.   
  13. //把元素e插入最后  
  14. public void addLast(E e) {  
  15.     //等价于把元素e插入到header的前面,因为是双链表  
  16.     addBefore(e, header);  
  17. }  
  18.   
  19. //在指定位置插入元素e,原index处和以后的元素往后移  
  20. public void add(int index, E element) {  
  21.     //index == size,把元素e插入到header的前面  
  22.     //其他情况把元素e插入entry(index)的前面  
  23.     addBefore(element, (index == size ? header : entry(index)));  
  24. }  
  25.   
  26.   
  27. //把元素e插入到指定entry的前面  
  28. private Entry<E> addBefore(E e, Entry<E> entry) {  
  29.     Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);  
  30.     newEntry.previous.next = newEntry;  
  31.     newEntry.next.previous = newEntry;  
  32.     size++;  
  33.     modCount++;  
  34.     return newEntry;  
  35. }  

 

 .取数据

Java代码  收藏代码
  1. //取指定位置的元素  
  2. public E get(int index) {  
  3.     return entry(index).element;  
  4. }  
  5.   
  6. private Entry<E> entry(int index) {  
  7.     if (index < 0 || index >= size)  
  8.         throw new IndexOutOfBoundsException("Index: " + index + ", Size: "  
  9.                 + size);  
  10.     Entry<E> e = header;  
  11.     //在链表中取值时,需要遍历整个链表,  
  12.     //即使优化成遍历半个链表,相对于ArrayList的随机访问,还是慢的  
  13.     if (index < (size >> 1)) {  
  14.         for (int i = 0; i <= index; i++)  
  15.             e = e.next;  
  16.     } else {  
  17.         for (int i = size; i > index; i--)  
  18.             e = e.previous;  
  19.     }  
  20.     return e;  
  21. }  
  22.   
  23. //取第一个节点处的元素  
  24. public E getFirst() {  
  25.     if (size == 0)  
  26.         throw new NoSuchElementException();  
  27.   
  28.     return header.next.element;  
  29. }  
  30. //取最后一个节点处的元素  
  31. public E getLast() {  
  32.     if (size == 0)  
  33.         throw new NoSuchElementException();  
  34.   
  35.     return header.previous.element;  
  36. }  
  37.   
  38. //和ArrayList一样的算法,只是ArrayList遍历数组,LinkedList遍历链表  
  39. public int indexOf(Object o) {  
  40.     int index = 0;  
  41.     if (o == null) {  
  42.         //遍历链表  
  43.         for (Entry e = header.next; e != header; e = e.next) {  
  44.             if (e.element == null)  
  45.                 return index;  
  46.             index++;  
  47.         }  
  48.     } else {  
  49.         for (Entry e = header.next; e != header; e = e.next) {  
  50.             if (o.equals(e.element))  
  51.                 return index;  
  52.             index++;  
  53.         }  
  54.     }  
  55.     return -1;  
  56. }  

 

 六.删数据

Java代码  收藏代码
  1. //remove默认删除第一个位置的元素  
  2. public E remove() {  
  3.     return removeFirst();  
  4. }  
  5.   
  6. public E removeFirst() {  
  7.     return remove(header.next);  
  8. }  
  9.   
  10. public E removeLast() {  
  11.     return remove(header.previous);  
  12. }  
  13.   
  14. //和ArrayList一样的算法,只是ArrayList遍历数组,LinkedList遍历链表  
  15. public boolean remove(Object o) {  
  16.     if (o == null) {  
  17.         for (Entry<E> e = header.next; e != header; e = e.next) {  
  18.             if (e.element == null) {  
  19.                 //转换成remove(Entry)  
  20.                 remove(e);  
  21.                 return true;  
  22.             }  
  23.         }  
  24.     } else {  
  25.         for (Entry<E> e = header.next; e != header; e = e.next) {  
  26.             if (o.equals(e.element)) {  
  27.                 //转换成remove(Entry)  
  28.                 remove(e);  
  29.                 return true;  
  30.             }  
  31.         }  
  32.     }  
  33.     return false;  
  34. }  
  35.   
  36. //转换成remove(Entry)  
  37. public E remove(int index) {  
  38.     return remove(entry(index));  
  39. }  
  40.   
  41. //删除指定节点:删除操作都将落到这个方法上  
  42. private E remove(Entry<E> e) {  
  43.     if (e == header)  
  44.         throw new NoSuchElementException();  
  45.   
  46.     E result = e.element;  
  47.     e.previous.next = e.next;         
  48.     e.next.previous = e.previous;    
  49.     //把节点的三个属性全部置为空  
  50.     e.next = e.previous = null;  
  51.     e.element = null;  
  52.     size--;  
  53.     modCount++;  
  54.     return result;  
  55. }  

 

 .遍历

Java代码  收藏代码
  1. private class ListItr implements ListIterator<E> {  
  2.         private Entry<E> lastReturned = header;  
  3.         private Entry<E> next;  
  4.         private int nextIndex;  
  5.         private int expectedModCount = modCount;  
  6.   
  7.                 //初始化的时候next = header.next;  
  8.         ListItr(int index) {  
  9.             if (index < 0 || index > size)  
  10.                 throw new IndexOutOfBoundsException("Index: " + index  
  11.                         + ", Size: " + size);  
  12.             if (index < (size >> 1)) {  
  13.                 next = header.next;  
  14.                 for (nextIndex = 0; nextIndex < index; nextIndex++)  
  15.                     next = next.next;  
  16.             } else {  
  17.                 next = header;  
  18.                 for (nextIndex = size; nextIndex > index; nextIndex--)  
  19.                     next = next.previous;  
  20.             }  
  21.         }  
  22.                   
  23.         public boolean hasNext() {  
  24.             return nextIndex != size;  
  25.         }  
  26.                 //遍历的时候next = next.next,按照从头往后遍历,也就是FIFO的顺序  
  27.         public E next() {  
  28.             checkForComodification();  
  29.             if (nextIndex == size)  
  30.                 throw new NoSuchElementException();  
  31.   
  32.             lastReturned = next;  
  33.             next = next.next;  
  34.             nextIndex++;  
  35.             return lastReturned.element;  
  36.         }  
  37.   
  38.           
  39.     }  
分享到:
评论

相关推荐

    02-Java集合容器面试题(2020最新版)-重点.pdf

    ### Java集合容器知识点详解 #### 一、集合容器概述 - **定义**:集合容器是Java平台提供的标准组件,主要用于存储对象。...通过本篇文章的学习,希望读者能够更好地理解和应用Java集合容器,提升编程技能。

    java软件技术文档-深入java8的集合2:LinkedList的实现原理.pdf

    《深入Java8的集合2:LinkedList的实现原理》 LinkedList是Java编程语言中实现List接口的一种数据结构,它采用双链表的方式存储元素。本文将深入解析LinkedList的内部机制,帮助开发者理解其工作原理。 首先,...

    thinkinjava源码-Thinking-in-java:Java编程思想源码及习题!

    - **集合框架**:Java的ArrayList, LinkedList, HashMap等容器类的使用会在源码中体现,帮助理解数据存储和操作。 - **泛型**:源码将展示如何使用泛型编写类型安全的代码,减少类型转换的麻烦。 - **枚举**:...

    Java面试专题-面试人员必看-微服务架构面试专题系列:BAT面试常问80题.rar

    - **集合框架**:熟练运用ArrayList、LinkedList、HashMap、HashSet等容器,了解它们的性能特点和使用场景。 - **多线程**:理解线程的创建方式,同步机制如synchronized和Lock,以及并发工具类。 2. **微服务...

    阿里校招社招常考面试题(86题 11页).pdf

    2. **Tomcat**:不仅可以解析 JSP 动态页面,还可以作为 Servlet 容器。 3. **JBoss**:是一个全面的应用服务器,可以部署各种 Java 应用。 #### 五、GET 与 POST 区别 1. **数据提交方式**: - **GET**:通过 ...

    2024年java面试题-java集合相关面试题

    ### 一、集合容器概述 #### 1. 什么是集合? 集合(Collection)是指在Java中用来存储、检索及操作一组对象的一种容器。它是一种高级的数据结构,主要用于管理一组对象,而不仅仅是简单地存储这些对象。 #### 2. ...

    java 学习笔记

    在Java学习笔记中,我们重点关注Java的IO(输入/输出)操作、常用类库以及集合框架。 1. **Java IO**: - **File类**:提供了文件和目录的基本操作,如创建、删除、重命名等。 - **RandomAccessFile**:支持对...

    Google-Apps-Script-LinkedList:GAS 中的 LinkedList 功能(Google Apps 脚本)

    Google-Apps-Script-LinkedList GAS 中的 LinkedList 功能(Google Apps 脚本) 例子 // To add var ll = new LinkedList ( ) ; ll . add ( 'foo' ) ; ll . add ( 'foo2' ) ; ll . add ( 'foo3' ) ; // To add 2 ...

    java面试题

    #### 八、EJB技术基础及SessionBean与EntityBean的区别 - **EJB 技术基础**:基于 JNDI、RMI/IIOP、JMS、JDBC 等技术。 - **SessionBean 与 EntityBean 区别**: - **SessionBean**:用于业务逻辑处理,分为有状态...

    java.util源码-java-source-code:java.util源码阅读

    Java.util 源码分析 Java.util 包是 Java 核心库的重要组成部分,它包含了许多用于日常编程的工具类和接口,如集合框架、日期时间处理、随机数生成、事件处理等。深入理解这个包的源码对于提升Java开发者的技能至关...

    Java集合部分面试题.docx

    - **List**:有序的集合,允许重复元素,如ArrayList和LinkedList,它们类似于可变长度的数组。 - **Map**:存储key-value对的对象,如HashMap、TreeMap和Hashtable,它们不继承Collection接口,因为它们的元素...

    java集合与映射(牛)

    Java集合框架主要包括两种类型的容器:集合(Collection)和映射(Map)。其中集合用于存储一组不重复的对象,而映射则用于存储键值对。 #### 二、集合(Collection) Java中的集合框架主要包括以下几种类型的集合...

    疯狂的IT人最新整理的Java EE面试总结

    - **LinkedList**: 使用双向链表实现,适合频繁插入和删除操作。 - **ArrayList**: 使用动态数组实现,适用于随机访问。 - **Vector**: 类似于ArrayList,但提供线程安全性。 - **Set**: 无序且不包含重复元素的...

    Data-Structures---Algorithms:使用Java的数据结构和算法

    - **回溯法**:解决组合问题和搜索问题,如八皇后问题、N皇后问题、迷宫问题。 - **动态规划**:用于优化多阶段决策过程,如背包问题、最长公共子序列、最短路径问题。 - **贪心算法**:局部最优解策略,如霍夫曼...

    java源码嵌套for循环-cs-implementing-a-linkedlist-lab-codeU:cs-implementing-a-

    循环的java源码压缩cs-实施-a-链表实验室 目标 用 Java 实现一个链表。 编写 List 接口的实现。 概述 在本实验中,我们提供了 List 接口的部分实现,该接口使用链表来存储元素。 我们留下了三个不完整的方法; 您的...

    2019互联网面试题第2季 (2).pdf

    ### 2019互联网面试题第2季之...通过以上分析,我们可以看到,在Java编程中选择合适的字符串处理工具、集合类型以及会话管理技术对于提高程序性能和安全性至关重要。开发者应根据具体的应用场景和技术需求合理选择。

    源码解析jdk7.0集合:LinkedList的底层实现原理.pdf

    在深入分析JDK 7.0中LinkedList集合的底层实现原理前,我们首先需要了解LinkedList的基本概念。LinkedList,即双向链表,是一种通过双向指针相互连接的数据结构,每个节点包含数据域以及指向前驱和后继节点的指针。...

    Container

    ### 容器(Container)知识点详解 #### 一、数组(Array) **数组定义**: 数组是一种基本的数据结构,用于存储相同类型的多个元素。数组是Java中最简单且高效的容器之一,能够提供快速的元素访问。 **特点**: - **...

    collectionJava源码-Edureka-Java-Assignment:作为Edureka的Amdocs课程一部分提交的Java源代

    在本项目"collectionJava源码-Edureka-Java-Assignment"中,我们主要关注的是Java集合框架的源代码分析,这是在Edureka的Amdocs课程中作为学习任务提交的。这个压缩包"Edureka-Java-Assignment-master"很可能包含了...

Global site tag (gtag.js) - Google Analytics