探索Java集合框架—数据结构、ArrayList集合

这篇具有很好参考价值的文章主要介绍了探索Java集合框架—数据结构、ArrayList集合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景介绍

Java集合的使用相信大家都已经非常得心应手,但是我们怎么做到知其然,更知其所以然这种出神入化的境界呢?我们揭开集合框架底层神秘面纱来一探究竟

目录

一、背景介绍

二、思路&方案

数据结构是什么?

数据结构可以分为线性和非线性两种数据结构

线性数据结构:

非线性数据结构:

Java集合分类

Collection接口:

Map接口:

三、过程

ArrayList和LinkedList的区别有哪些?

ArrayList是如何存储数据的?

ArrayList扩容机制

①、如何进行扩容的?

②、增加元素

③、ArrayList给指定位置插入元素

④、删除元素

按照下标位置删除元素

按照内容删除元素

四、总结


二、思路&方案

在说集合之前我们要先了解数据结构这一概念

数据结构是什么?

数据结构时对数据进行组织和存储一种方式,数据使用不同的数据结构组织和存储时所带来的时间和空间性能也是不同的。List、Set、Map集合背后使用了不同的数据结构,我们理解为集合是一种数据结构的具体实现。例如:可以使用数组结构来实现集合,当访问数组元素的时候通过数组下标查找时更快。

程序=数据结构+算法。数据结构还提供了一些各种查找、排序算法,集合可以用来解决一堆数据的处理问题,如:查找、排序、去重等等

数据结构可以分为线性和非线性两种数据结构

线性数据结构:

特点:

一对一的关系并且逻辑上有序,数据元素之间存在一个前后关系,每个元素只有一个直接前驱和一个直接后去

组成:
  • 数组(Array):相同类型元素并且连续存储
  • 链表(LinkedList):一系列node节点,每个节点包括数据、指向下一个节点的指针
  • 栈(Stack):先进后出(LIFO),在栈顶进行删除和插入操作
  • 队列(Queue):先进先出(FIFO),在队尾插入、对头删除元素

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

非线性数据结构:

特点:

多对多关系,数据元素之间不存在直接的前后关系,元素和元素之间通过指针相连,

包括:
  • 树(Tree):一组node节点组成,每个父节点下级可以有子节点,节点之间是上下层次关系
  • 图(Graph):一组节点、边之间的关系
  • 堆(Heap):实现优先队列
  • 散列表(Hash Table):根据关键字可以直接查询数据,通过散列函数确认存储位置

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

结合上面讲到的数据结构,我们来看下Java究竟是如何应用的


Java集合分类

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

集合相关类和接口都在java.util中,从宏观上我们把Java集合分为了以Collection为中心的实现类、以Map为中心的实现类, Collection和Map两个接口下面分别有不同的实现类,它们都是用来存储和操作数据的集合

Collection接口:

特点:

一组对象的集合,通过索引或迭代器访问元素,元素可以重复

包括:
  • List:有序集合
  • Set:无序集合
  • Queue:先进先出集合

Map接口:

特点:

键值对映射的集合,通过key查找value,每个key是唯一的

包括:
  • HashMap:通过哈希表实现,无序
  • TreeMap:基于红黑树实现,有序
  • LinkedHashMap:哈希表+双向链表实现,顺序插入

今天先重点来讲讲List集合中ArrayList增删改查是如何实现的


三、过程

ArrayList和LinkedList的区别有哪些?

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

ArrayList是如何存储数据的?

底层是数组,数组存储的数据的特点是元素类型相同并且数组容量固定

数组存储容量固定?那在实际业务场景中数据肯定是不固定的呀?如何解决?

ArrayList扩容机制

ArrayList提供了自动扩容机制,当插入数据时候底层会先判断是否需要扩容,如果当前容量+1超过数组长度,就会进行扩容,反之。

①、如何进行扩容的?

ArrayList内部封装了一个动态再分配的对象数组,ArrayList的底层数据库初始容量为10,扩容因子为1.5

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

 探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

②、增加元素

当我们第一次添加元素使用add()方法添加元素的过程中,底层的流程是这样的:

内部会调用ensureExplicitCapacity()方法判断添加元素之后的数组长度是否大于数组容量,如果超出数组容量调用grow()方法扩容,否则给数组长度+1

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

当第一次对数组进行add添加元素的时候,才会把内部的数组扩容为10,这也是数组的第一次扩容

 注意:

  • 数组长度是指当前数组内元素的个数
  • 数组容量是指数组所能容纳的长度

示意图:

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

那如果要添加的元素不足数组容量呢?现在我们来看下具体是如何扩容的?

假设场景:数组中已经有10个元素,需要添加第11个元素

calculateCapacity方法内部首先会判断elementData数组是否是默认的空数组(看是否往数组里面添加了元素),如果不是默认数组则返回添加元素之后数组所需要的长度

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

如果添加元素之后的数组长度超出了数组容量,则说明需要扩容,调用grow()方法进行扩容

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

 grow()方法内部会调用一个交copyOf方法进行扩容,会创建一个1.5倍的新数组,将原来的数组元素挪到新数组中

此时ArrayList扩容为原来的大小+原来大小/2=10+5=15,数组扩容后容量为15

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

 扩容后的数组示意图如下:探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

add(E e)添加元素的流程为:

第一步、判断是否需要扩容:

        需要扩容

                ①、计算新数组容量:newCapacity = oldCapacity + (oldCapacity >> 1)

                ②、创建新数组:elementData = Arrays.copyOf(elementData, newCapacity)

第二步、追加元素到数组末尾 。  elementData[size++] =element;

第三步、添加成功

③、ArrayList给指定位置插入元素

示例:

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

添加指定位置流程如下:

第一步、检查下标是否越界

        越界:抛出IndexOutOfBoundsException异常

第二步、判断是否需要扩容,如果需要扩容则扩容

第三步、后移元素.从指定要插入元素位置依次向后移动一个位置,此时指定要插入的位置为空

第四步、插入新元素。将要插入的元素放入指定位置

第五步、更新数组大小。size+1

        

注意: 其中rangeCheckForAdd(index)方法会检查下标是否越界,如果要插入的元素位置超出了当前数组的容量,会抛出”IndexOutOfBoundsException“的异常

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

 示意图:探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

④、删除元素

按照下标位置删除元素

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合

按照内容删除元素

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合


四、总结

通过分析源码我们了解了ArrayList底层增删改查操作具体的细节,再次总结

探索Java集合框架—数据结构、ArrayList集合,java集合,arraylist,List集合文章来源地址https://www.toymoban.com/news/detail-684321.html

到了这里,关于探索Java集合框架—数据结构、ArrayList集合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】搜索树 与 Java集合框架中的Set,Map

    作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏:《

    2024年02月08日
    浏览(24)
  • [JAVA数据结构]顺序表ArrayList

    目录 1.线性表 2.顺序表 3.ArrayList简介 4.ArrayList的使用  4.1ArrayList的构造方法 4.2ArrayList的常用操作 4.3ArrayList的遍历方法 4.4ArrayList的扩容机制 5.ArrayList的具体运用 ArrayList是一种基于数组的数据结构,是线性表的一种,也是顺序表。 通俗来说,线性表是一种线性结构,在逻辑上

    2023年04月26日
    浏览(28)
  • 【Java--数据结构】模拟实现ArrayList

    欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 LIst 顺序表ArrayList 顺序表优点 IList接口 ArrayList中定义要操作的数组 在MyArrayList中 重写接口方法 新增元素 在指定位置插入元素  pos不合法异常 判断和查找元素 获取和更新元素 删除元素和清空顺序

    2024年04月25日
    浏览(23)
  • 【数据结构】 初识集合框架

    这里博主将简单介绍一下集合框架,想要详细了解的可以点击下方链接进行查看 java集合官方教程 Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。 其主要表现为将多个元素 element 置于一个单元中,用于

    2024年02月13日
    浏览(28)
  • Java 中数据结构ArrayList的用法

    ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 add() 将元素插入到指定位置的 arraylist 中 addAll() 添加集合中的所有元素到 arraylist 中 clear() 删除 arraylist 中的所

    2024年02月10日
    浏览(30)
  • 数据结构 之 顺序表 ArrayList (Java)

    🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!! 🌈个人主页: AUGENSTERN_dc 🔥个人专栏: C语言  |  Java | 数据结构 ⭐个

    2024年03月17日
    浏览(25)
  • 数据结构(Java实现)-ArrayList与顺序表

    什么是List List是一个接口,继承自Collection。 List的使用 List是个接口,并不能直接用来实例化。 如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 常见的线性表

    2024年02月11日
    浏览(26)
  • 集合框架及背后的数据结构

    大家好,我是晓星航。今天为大家带来的是 集合框架及背后的数据结构 的讲解!😀 官方教程 Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。 其主要表现为将多个元素 element 置于一个单元中,用于对

    2024年01月18日
    浏览(34)
  • [java数据结构] ArrayList和LinkedList介绍与使用

    (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的模拟实现 5. LinkedList的优缺点 (四) ArrayList和LinkedList的区别

    2024年01月21日
    浏览(33)
  • java八股文面试[数据结构]——ArrayList和LinkedList区别

      ArrayList和LinkedList的异同 二者的线程都不安全,相对线程安全的Vector,执行效率高。此外,ArrayList时实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedList比较占优势,因为LinledList要移动指针。对于新增和删除操作add

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包