/**
* jdk8
* ArrayList:底层动态数组实现(未初始化指定数组长度)
* add():添加元素时,才初始化数组长度为10。容量不够时,动态扩容策略为: 原容量 + 原容量*0.5
* get():根据数组索引直接查询数组
* remove():根据索引查询数组,然后将其他数据进行前移,最后将最后的那个索引对应值置为Null,等待GC回收
*==================================================================================
* LinkedList: 底层双向链表实现
* Node(Node<E> prev, E element, Node<E> next) {
* this.item = element;
* this.next = next;
* this.prev = prev;
* }
*
* final Node<E> newNode = new Node<>(l, e, null);
* last = newNode;
* if (l == null)
first = newNode;
* else
* l.next = newNode;
*
* =================================================================
* add()方法添加过程:new Node(),将element存放在newNode中,newNode.prev 指向last节点
* newNode.next 指向null
* 判断last节点是否为空,若为null,则 first = last = newNode;
* 否则last.next执行newNode
*
* newNode.prev 绑定 last,last.next 绑定 newNode,实现双向绑定(双向链表)
*
*
* ================================================================
* add(index,element)方法添加过程:
* 判断index是否等于当前集合大小,若等于则直接类似add()方法添加
* 若不等于,则:
* 1、根据index查询将要插入位置的节点 Node node(index)
* 2、linkBefore(element, node(index));
* Node<E> succ = node(index);
*
* Node pred = succ.prev
*
* ******将newNode绑定在succ和succ.prev之间*************
* 将newNode.next = succ
* 将newNode.prev = pred;
*
* ---------将succ.prev,pred.next重新指向newNode,实现双向绑定------
* 将succ.prev = newNode
* 将pred.next = newNode
*
*
* public void add(int index, E element) {
* if (index == size)
* linkLast(element);
* else
* linkBefore(element, node(index));
* }
*
*
* // 找到新插入位置的节点的next或prev
* 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;
* }
* }
*
*
* void linkBefore(E e, Node<E> succ) {
* // assert succ != null;
* final Node<E> pred = succ.prev;
* final Node<E> newNode = new Node<>(pred, e, succ);
* succ.prev = newNode;
* if (pred == null)
* first = newNode;
* else
* pred.next = newNode;
* size++;
* modCount++;
* }
*
* 综上:
* ArrayList:动态数组实现;对于指定位置的添加和删除操作之后,都会有移动元素操作。导致效率低下,而查询则根据索引直接定位,效率高
*
* LinkedList:双向链表实现,对于指定位置的添加和删除操作之后,只需要修改其位置节点执向即可,效率高。而查询则根据节点引用层层调用,效率低下
*
*/

ArrayList、LinkedList区别(jdk8)的更多相关文章

  1. Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别

    ArrayList和Vector的区别ArrayList与Vector主要从二方面来说.  一.同步性:   Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...

  2. LinkedList和ArrayList的区别/何时使用LinkedList和ArrayList

    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList ...

  3. 简谈ArrayList和LinkedList区别

    对于ArrayList和LinkedList,他们都实现了List接口,他们的区别大致为: ArrayList LinkedList (1)底层是数组,可以以O(1)的时间复杂度对元素进行随机访问 以 ...

  4. String[]和ArrayList和LinkedList区别

    String[]和ArrayList和LinkedList区别 参考文档如下: http://www.blogjava.net/flysky19/articles/92775.html http:// ...

  5. LinkedList和ArrayList的区别

    LinkedeList和ArrayList都实现了List接口,但是它们的工作原理却不一样.它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doub ...

  6. Hashtable,HashMap,TreeMap有什么区别?Vector,ArrayList,LinkedList有什么区别?int和Integer有什么区别?

    接着上篇继续更新. /*请尊重作者劳动成果,转载请标明原文链接:*/ /*https://www.cnblogs.com/jpcflyer/p/10759447.html* / 题目一:Hashtab ...

  7. List的三个子类ArrayList,LinkedList,Vector区别

    一:List的三个子类的特点 ArrayList: 底层数据结构是数组,查询快,增删慢. 线程不安全,效率高.Vector: 底层数据结构是数组,查询快,增删慢. 线程安全,效率低.Vector相对A ...

  8. Android LinkedList和ArrayList的区别

    LinkedeList和ArrayList都实现了List接口,但是它们的工作原理却不一样.它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doub ...

  9. 一、基础篇--1.2Java集合-Arraylist 与 LinkedList 区别

     Arraylist 与 LinkedList 区别  结构上的区别 ArrayList底层实现基于动态数组,LinkedList底层实现基于双向链表.  性能上区别 ArrayList查询快,增删慢 ...

随机推荐

  1. JWT实现token-based会话管理(转)

    JWT实现token-based会话管理   阅读目录 认识JWT demo要点说明 小结 上文<3种web会话管理的方式>介绍了3种会话管理的方式,其中token-based的方式有必要 ...

  2. linux中其他搜索命令(locate/which/whereis/grep)

    目录 locate which whereis grep locate 解释 命令名称:locate 命令所在路径:/usr/bin/locate 执行权限:所有用户 功能描述:在文件资料库中查找文件 ...

  3. 解读前端js中签名算法伪造H5游戏加分

    信息安全在我们日常开发中息息相关,稍有忽视则容易产生安全事故.对安全测试也提出更高要求.以下是笔者亲自实践过程: 一. 打开某个数钱游戏HTML5页面,在浏览器 F12 开发工具中,查看的js,如下, ...

  4. Android中自定义xml文件给Spinner下拉框赋值并获取下拉选中的值

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...

  5. 5.Android-电话拨号器详解

    之前学习了3.Android-ADT之helloworld项目结构介绍后,本章便来写个简单的电话拨号器程序. 实现的步骤如下所示: 1.创建项目 2.写layout/activity_main.xml ...

  6. itest(爱测试) 4.5.0 发布,开源BUG 跟踪管理 & 敏捷测试管理软件

    itest 简介 test 开源敏捷测试管理,testOps 践行者.可按测试包分配测试用例执行,也可建测试迭代(含任务,测试包,BUG)来组织测试工作,也有测试环境管理,还有很常用的测试度量:对于发 ...

  7. 架构师成长系列 | 从 2019 到 2020,Apache Dubbo 年度回顾与总结

    作者 | 刘军(陆龟)Apache Dubbo PMC 本文整理自架构师成长系列 2 月 18 日直播课程. 关注"阿里巴巴云原生"公众号,回复 "218",即 ...

  8. UCF Local Contest 2015 J 最小割

    题意: 有

  9. MySql概述及入门(五)

    MySql概述及入门(五) MySQL集群搭建之读写分离 读写分离的理解 为解决单数据库节点在高并发.高压力情况下出现的性能瓶颈问题,读写分离的特性包括会话不开启事务,读语句直接发送到 salve 执 ...

  10. 解决jQuery中input 失去焦点之后,不能再获取到焦点

    //编辑过敏史 if(iToolbar == 'editGMS'){ lstype="gms"; var gms=""; if(gmstype=="0 ...