java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

文章目录

  • 数据结构
  • 总结
  • ArrayList源码底层
  • LinkedList
    • 底层源码
  • 迭代器底层

数据结构

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第1张图片
对于数据结构我这边只告诉你右边框框里的
java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第2张图片

栈的特点:后进先出,先进后出,入栈也成为压栈,出栈也成为弹栈
栈就像一个弹夹

队列先进先出后进后出
队列像排队

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第3张图片


java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第4张图片

链表查询满 但是增删快(相对于数组而言)

拓展:还有一个双向链表 他在查询元素的时候更快些,因为他在拿到一个元素后先判断离头结点近一点还是尾结点

总结

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第5张图片

ArrayList源码底层

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第6张图片

ArrayList用空参构造创建对象.在底层创建一个默认长度为0的数组elementData(数组名) 然后有一个size指向元素
添加第一个元素的时候,底层才会创建一个新的长度为10的1数组`
数组存满的时候回添加一个新数组 新数组是老数组长度的1.5倍 并且会把老数组的内容拷贝过去
size有两个含义:一个是集合长度 一个当他完成存储他会指向下次存入的位置

如果一次添加多个元素,1.5倍放不下,则新创建数组的长度以实际为准
java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第7张图片
上图为添加一个元素的经过的流程

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第8张图片

上图为长度为10的数组装满如何扩容
minGrowth是至少要增加的容量
prefGrowth是默认新增容量的大小.就是老容量的1.5倍

LinkedList

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第9张图片
java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第10张图片
独有api,了解即可,因为这些方法,Collectoin都可以实现

底层源码

LinkedList底层是一个双向链表所以他有
空参构造的成员位置有size和first last 头结点为节点.当掉用空参构造就会自动生成这些

node有三个成员变量
item现在要存储的数据
next 下一个结点要记录的地址值
prev我要记录前一个结点的地址值


java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第11张图片

空参构造创建完对象就是上图的样子
java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第12张图片

添加了一个结点

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第13张图片

添加第二个元素的操作
java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第14张图片
添加第三个.元素添加完毕

迭代器底层

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第15张图片

获取迭代器对象后相当于创建自己内部类对象(Itr)
内部类有三个成员变量
cursor指针默认初始化0
lasRet刚刚操作索引的位置

java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第16张图片

hasNext判断原理
指针跟size比较直到指针为3


java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层_第17张图片
上面源码就是为什么使用集合的方法太你家删除元素会报错的原因.因为modCount在使用add或者remove会自增 最后他会拿着一开始modCount的值跟最新变化次数作比较 如果不一样就会报错

你可能感兴趣的:(java,数据结构,开发语言)