前言:

此篇文章讲解ArrayList和LinkedList底层实现原理、for和foreach遍历集合哪个效率会更高一些!

讲讲什么是集合框架?集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。

没学集合框架之前我们存储多个数据是采用数组实现的,但是我们要创建数组的话先要初始化数组容量

 

这个时候我们可以使用到集合框架了 List 集合框架接口:

集合框架结构图

List接口


public interface List<E> extends Collection <E>{}

List接口中存储元素的特点:

List中存储的元素实现类排序,而且可以重复的存储相关元素。

(1)ArrayList:

 优点:操作读取操作效率高,基于数组实现的,可以为null值,可以允许重复元素,有序,异步。
 缺点:由于它是由动态数组实现的,不适合频繁的对元素的插入和删除操作,因为每次插入和删除都需  要移动数组中的元素。

(2)LinkedList:

优点:LinkedList由双链表实现,增删由于不需要移动底层数组数据,其底层是链表实现的,只需要修改链表节点指针,对元素的插入和删除效率较高。
缺点: 遍历效率较低。HashMap和双链表也有关系。

ArrayList成员变量

LinkeList成员变量

图截的不好,望包涵,手有点抖

聊聊ArrayList和LinkeList的底层数据结构

先谈谈LinkedList底层数据结构

话不多说先上图

  -- 具有头节点和尾节点的双链表


                                          -- 附上一张别人的画图(若有侵权请及时联系作者删除)

作者是个手残党画得扭扭曲曲的

双链表是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。所以删除和插入元素只需要修改链表节点指针就可以了,不像ArrayList一样,ArrayList底层使用数组实现的,每一次删除或修改数组都会移动元素。

谈谈ArrayList底层数据结构

ArrayList底层由数组实现,在实例化一个ArrayList时没给予构造函数数组个数参数,集合中的数组默认是10的容量,在调用add方法时如果容量已满,会将数组的容量扩大1.5倍的容量 如图1

如果有兴趣的同学,可以试下实现一个MyArratList,多看看内部实现原理,便更能随心所欲的使用它。

给大家扯扯ArrayList和LinkeList的add添加元素的内部实现

List接口中有有很多的接口方法,如size()、isEmpty()、clear()等等.....,我就不一 一写这么多了。

ArrayList的添加元素方法

1,先从add方法说起,执行add方法里面会先执行 ensureCapacity() 方法,先讲讲它是干嘛的吧!主要是确保数组的容量是否能继续添加元素,未声明集合容量的话,默认是 为10的,所以一当可用容量满后将会把数组容量扩大1.5倍。

2,讲讲ensureCapacity()方法,当(元素数量+1)大于 数组长度时,会将容量扩大1.5倍,先创建一个新数组来存放数据,再扩大数组容量,最后拷贝到 elementData 数组中。

LinkedList的添加元素方法

1,LinkedList底层使用链表实现,实现添加删除元素操作会比ArrayList效率高很多,LinkedList添加只需改变最后节点的指向即可,不会改变或挪动其他的元素。

       -- 往链表中添加元素图

 

使用for循环遍历效率高还是foreach(增强式循环)?

1,for语法

for (int i = 0; i < integers.length; i++) {

System.out.println(intergers[i]);

}

2,foreach 语法

for(Integer in : integers){

System.out.println(in);

}

 

1,使用for适合循环ArrayLIst以及数组,当大批量的循环LinkedList时程序将会卡死,for适合循环数组结构,通过下标去遍历。

2,使用foreach适合循环LinkedList,使用双链表结构实现的应当使用foreach循环。

深入理解List集合框架底层原理的实现的更多相关文章

  1. 【T-SQL进阶】02.理解SQL查询的底层原理

    本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...

  2. 【深入理解Java集合框架】红黑树讲解(上)

    来源:史上最清晰的红黑树讲解(上) - CarpenterLee 作者:CarpenterLee(转载已获得作者许可,如需转载请与原作者联系) 文中所有图片点击之后均可查看大图! 史上最清晰的红黑树讲 ...

  3. 理解SQL查询的底层原理

    阅读目录 一.SQL Server组成部分 二.查询的底层原理 本系列[T-SQL]主要是针对T-SQL的总结. T-SQL基础 [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  4. 深入理解Logger日志——框架绑定原理

    深入理解Logger日志--框架绑定原理 说到Logger日志的动态绑定,主要归功与Slf4j,在之前的文章也说过,Slf4j是类似于Apache Common-Logging,英文为Simple L ...

  5. 我所理解Java集合框架的部分的使用(Collection和Map)

    所谓集合,就是和数组类似——一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接 ...

  6. 自顶向下理解Java集合框架(三)Map接口

    Map基本概念 数据结构中Map是一种重要的形式.Map接口定义的是查询表,或称查找表,其用于储存所谓的键/值对(key-value pair),其中key是映射表的索引. JDK结构中还存在实现Ma ...

  7. 《深入理解Java集合框架》系列文章

    Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framewo ...

  8. java集合框架使用原理分析

    集合是我们日常编程中可能用的很多的技术之一 使用频率极高 可能平时就会知道怎么去用 但是集合之间的关系与不同之处都不是很清楚 对它们的底层原理更甚 所以写词文章 让自己有一个更深的认识 集合是一个庞大 ...

  9. 深入理解java集合框架之---------LinkedList

    日常开发中,保存一组数据使用的最多的就是 ArrayList, 其次就是 LinkedList 了. 我们知道 ArrayList 是以数组实现的,遍历时很快,但是插入.删除时都需要移动后面的元素,效 ...

随机推荐

  1. Day7 访问权限

    构造者模式思想 进行初始化,解决了多个构造器重载,构造器参数过多记不住的情况. package day7;//声明一个程序包 class Employee{ private String name; ...

  2. 集合之hascode方法

    在前面三篇博文中LZ讲解了(HashMap.HashSet.HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最精华的部分, ...

  3. VC++中的__super::

    在学习别人的代码时,发现了一个__super,第一感觉很像java中的super,或者C#中的base网上查了一下发现作用差不多,都是指父类.C++本身没有__super,这是visual c++的扩 ...

  4. JQuery Validate插件与实现

    菜鸟拙见,望请纠正 一:效果展示:以下是两个注册表单验证,左边使用Jquery validate插件实现,右边是自己用JQuery实现,效果差不多,但个人推荐用插件,毕竟前人栽了树而且长大了后人当然好 ...

  5. springboot activiti 整合项目框架源码 shiro 安全框架 druid windows10风格

     官网:www.fhadmin.org  此项目为Springboot工作流版本 windows 风格,浏览器访问操作使用,非桌面应用程序. 1.代码生成器: [正反双向](单表.主表.明细表.树形表 ...

  6. .NET中Quartz任务调度器的简单应用实例

    1.首先从NuGet中安装Quartz,安装最新版本就OK 2.新建一个Job类实现Quart中的IJob接口用于执行业务逻辑,代码如下: class CheckUpdateJob : IJob { ...

  7. layedit富文本编辑器获取纯文字内容和全部内容

  8. PHP:CURL分别以GET、POST方式请求HTTPS协议接口api

    1.curl以GET方式请求https协议接口 //注意:这里的$url已经包含参数了,不带参数你自己处理哦GET很简单 function curl_get_https($url){ $curl = ...

  9. 小白python语言基础

    程序概念层级 表达式 语句包含表达式 包和模块 程序 变量与储存 变量:对象的别名 命名规则:字母.数字.下划线 只能以字母或下划线开头     能包含空格/中文 避免python关键字或函数名 简短 ...

  10. SEO优化上首页之搜索引擎蜘蛛Spider原理

    Spider,蜘蛛,又名网页网络爬虫.网络机器人,是按照一定策略不断抓取互联网网页的特定程序.蜘蛛抓回的页面创建索引后参与排名,等待用户检索.为了网站优化自然排名上首页,精灵儿工作室下面详细剖析Spi ...