zoukankan      html  css  js  c++  java
  • java中LinkedList源码分析

    ArrayList是动态数组,其实本质就是对数组的操作。
    那么LinkedList实现原理和ArrayList是完全不一样的。
    现在就来分析一下ArrayList和LinkeList的优劣吧
    LinkedList是一个双向链表,每个元素都是一个Node对象,
    这个node对象里面有三个成员:
    E item;指向实际的元素
    Node<E> next;指向下一个节点
    Node<E> prev;指向前一个结点

    利用idea编辑器查看LinkedList的结构,发现只有三个成员变量。

    而所有的public方法操作的都是这个三个变量。
    下面逐个分析方法。

    主要就是调用了linkLast方法。

    步骤如下:
    第一步:l指向尾节点,
    第二步:创建新的节点newNode;因为是在链表的最后添加元素,所以新节点的next元素为null.
    第三步:尾节点指向新的节点
    第四步:如果l(之前的尾节点)为空,新节点当作第一个节点
    第五步:如果l(之前的尾节点)不为空,则之前的尾节点的next变量指向新节点。
    链表大小size++;
    修改的次数modCount++;

    List<String> list=new LinkedList<>();
    list.add("a");
    list.add("b");

    与ArrayList不同,LinkedList内存是按需分配的,不需要提前分配内存空间,因为操作的不是数组。

    get方法

    checkElementIndex(index);主要用于检查参数是否符合规范,没什么好说的。

    主要看node(index)方法。

    index<(size>>1)表示index小于size/2;
    如果index索引位于前半部分,从头开始根据next向后遍历;
    一直找到index-1索引处
    如果在后半部分从last处开始根据prev向前遍历。一直循环到index处。
    ArrayList中数组是连续存放的,可以根据索引直接定位元素,而LinkedList中,必须从头或尾顺着链接查找,所以论查询效率LinkedList没有ArrayList效率高;但是在链表前或尾添加和删除的效率倒是比ArrayList要高。

    LinkedList还提供了remove,add(int index,E element),indexOf(Object o)等等这些方法,基本上都是差不多的原理操作的。

  • 相关阅读:
    SqlCacheDependency [转]
    C#导出Word [ZT]
    ADO.NET Entity Framework 学习(1) [ZT]
    AJAX, JSON.js,Newtonsoft.Json.dll,nunit.framework.dll 源代码
    ADO.NET 1.1和2.0事务的区别
    Sql Server 2000 中游标的使用示例 [ZT]
    如何检测是否安装了.NET 2.0和.NET 3.0 [ZT]
    ORACLE 常用函数 [ZT]
    Resource 学习笔记
    GridView 双击选择行 [ZT]
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/12163985.html
Copyright © 2011-2022 走看看