深入理解List集合框架底层原理的实现
前言:
此篇文章讲解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集合框架底层原理的实现的更多相关文章
- 【T-SQL进阶】02.理解SQL查询的底层原理
本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...
- 【深入理解Java集合框架】红黑树讲解(上)
来源:史上最清晰的红黑树讲解(上) - CarpenterLee 作者:CarpenterLee(转载已获得作者许可,如需转载请与原作者联系) 文中所有图片点击之后均可查看大图! 史上最清晰的红黑树讲 ...
- 理解SQL查询的底层原理
阅读目录 一.SQL Server组成部分 二.查询的底层原理 本系列[T-SQL]主要是针对T-SQL的总结. T-SQL基础 [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- 深入理解Logger日志——框架绑定原理
深入理解Logger日志--框架绑定原理 说到Logger日志的动态绑定,主要归功与Slf4j,在之前的文章也说过,Slf4j是类似于Apache Common-Logging,英文为Simple L ...
- 我所理解Java集合框架的部分的使用(Collection和Map)
所谓集合,就是和数组类似——一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接 ...
- 自顶向下理解Java集合框架(三)Map接口
Map基本概念 数据结构中Map是一种重要的形式.Map接口定义的是查询表,或称查找表,其用于储存所谓的键/值对(key-value pair),其中key是映射表的索引. JDK结构中还存在实现Ma ...
- 《深入理解Java集合框架》系列文章
Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framewo ...
- java集合框架使用原理分析
集合是我们日常编程中可能用的很多的技术之一 使用频率极高 可能平时就会知道怎么去用 但是集合之间的关系与不同之处都不是很清楚 对它们的底层原理更甚 所以写词文章 让自己有一个更深的认识 集合是一个庞大 ...
- 深入理解java集合框架之---------LinkedList
日常开发中,保存一组数据使用的最多的就是 ArrayList, 其次就是 LinkedList 了. 我们知道 ArrayList 是以数组实现的,遍历时很快,但是插入.删除时都需要移动后面的元素,效 ...
随机推荐
- python 二维数组键盘输入
m = int(input()) grid = [[] for i in range(m)] for i in range(m): line = input().split(' ') for j in ...
- saltstack之混合匹配
需要-C参数: salt -C ## 使用grains属性来匹配 [root@hadoop0 pillar]# salt -C 'G@os:Ubuntu' test.ping uadoop1: Tru ...
- sudo: java: command not found
背景:搭建了jumpserver,给开发划分了所有权限,但是开发那边账户不能执行java命令 报错:sudo: java: command not found 解决方法: 在用户管理权限配置sudoe ...
- [Nagios] Error: Template 'timman' specified in contact definition could not be not found (c
Check nagios配置文件报错例如以下: [nagios@2 etc]$ /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios ...
- pipeline 发布war包
pipline 写法分为 脚本式和声明式,下面采用脚本式编程: node { stage('checkout') { echo '开始检出代码' checkout([$class: 'GitSCM', ...
- L2-022 重排链表(链表)
题目: 给定一个单链表 L1→L2→⋯→Ln−1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln−1→L2→⋯.例如:给定L为1→2→3→4→5→6 ...
- Android ViewPager设置监听注意事项
首先 implements View.OnClickListener 因为Item比较多用这个方便 设置监听要注意地方,如果在 onCreate 直接 findViewById布局里的ID是会出错的 ...
- 机器学习练习(一)-使用jupyter notebook
一个简单的分类机器学习练习,基于sklearn.sklearn是Python中的一个机器学习模块.它其中有数据.非常方便我们用它来训练机器学习的模型,和验证我们的想法.(官方网站:https://sc ...
- scribe日志系统安装笔记
版本历史 2011-02-12 17:36:57 完成文章2011-02-23 10:49:12 更新,修正部分文字 目前web访问日志为crontab定时清空,而且负载均衡后,访问随机分配到一台服务 ...
- Linux tree 命令乱码
今天在执行Linux下的tree命令的时候,出现了乱码.上网查了一下说需要使用tree --charset ASCII,强制使用ASCII字符.这样确实可以输出正常了.但是我的环境里的LANG=US. ...