【2023】ArrayList和LinkedList详解介绍对比 客官°小女子只卖身不卖艺 2024-03-17 23:29 77阅读 0赞 ## 一、ArrayList ## #### 1、概述 #### ArrayList是实现了List接口的动态数组,所谓动态数组就是他的大小是可变的。实现了所有可选列表操作,并允许包括Null在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。默认初始容量是10。默认初始容量为10。随着ArrayList中元素的增加,它的容量也会不断的自动增长。在每次添加元素时,ArrayList都会检查是否需要进行扩容操作,扩容操作带来数据向新数组的重新拷贝,所以如果我们知道具体业务数据量,在构造ArrayList时,可以给ArrayList 指定一个初始容量,这样就会减少扩容时的拷贝问题。当然在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。 #### ArrayList基本参数: #### `grow`() : 扩容方法 #### 扩容规则 #### * new ArrayList(),的初始容量是0; * new ArrayList(int initialCapacity),会使用指定容量的数组 * new ArrayList(Collection c),则会使用这个集合c的大小作为容量; * add(Object o):一个一个添加元素 * 当第一次add时,会首次扩容到10;然后把元素加到传递为10的数值中,当元素个数大于10时,会进行继续扩容; * 后面每一次扩容后的容量都会是原来数组的1.5倍;使用的计算方式:**是原来的长度右移一位得到原来的一半再加上原来的长度** ( 10 > > 1 + 10 ) = 15 (10>>1 + 10)=15 (10>>1\+10)=15 * 前10次扩容:\[0,10,15,22,33,49,73,109,163,224\] * addAll(Collection c):添加集合元素 * 当使用addAll添加集合元素,会对下次扩容的容量和实际的元素个数之间选一个较大的数作为扩容后的容量, #### 迭代器(**Iterator**):FailFast VS failSafe #### * FailFast (非哦发斯):当进行遍历时,不允许其他线程对集合来进行修改,会直接抛出异常 * FailSafe(非哦谁斯):当进行遍历时,运行运行其他线程对集合进行修改,只不过会牺牲部分一致性 1. ArrayList使用的就是FailFast 策略执行遍历的; 1. ArrayList再执行迭代时,迭代器对象会先记录集合的修改次数,然后去执行,迭代方法next(),然后再执行next()迭代方法时会先对比较迭代前的集合的修改次数和现在的修改次数是否相同,如果相同,则继续执行迭代;当不相同时,表示集合在迭代时,被修改过,则会抛出异常 2. CopyOnWriteArrayList (科批安外)使用的则是FailSafe策略执行遍历,再遍历时,允许其他线程进行修改 1. CopyOnWriteArrayList 再执行迭代时,使用的是读写分离的方式,在执行add方法添加元素时,不是直接添加在原来的数组里,而是在把原来的数组复制了一个新的数组,且长度在原来的基础上+1,添加的这个元素就放在了复制的数值扩容的那一个位置中,所以压根不会影响到迭代器遍历;只不过是牺牲了一致性,迭代时,读取不到这个新添加的元素而已。 ### ArrayList和LinkedList的区别 ### * ArrayList * 基于数组,需要连续内存 * 随机访问快(指根据下标访问),因为ArrayList的数据结构是数组,在内存中存储是连续的,随机访问时,就可以根据下标通过简单的运算得到想要寻找的元素。ArrayList也通过继承了RandomAccess接口,作为标识,让jdk在执行时,会采用下标的方式去寻找。而LinkedList则没继承 * 尾部插入、删除性能可以,其他部分插入、删除都会移动数据,因此性能会比较低, * 可以利用cpu缓存,局部性原理,因为ArrayList基于数组,所以在内存中存储是连续的,就可以很好的利用cpu缓存; * 因为cpu缓存是具有局部性原理的;cpu每次在读取内存的数据时,会把它缓存在cpu缓存中,这样就可以避免每次都直接到内存中去读取数据,可以有效的提高效率, * 而cpu的局部性原理则是,它每次到内存读取数据时,会顺带把你需要读取的数据的周边的数据也一并读到缓存中。因为cpu会觉得你有很大的概率会读取周边的数据。而数组刚好内存存储就是连续的,所以就可以有效的利用到这一点,减少直接到内存中去读取的次数。 * 而LinkedList则没法很好的利用这一点,因为它在内存中数据存储不是连续的,所以在读取时,没法有效的把接近的数据存储到CPU缓存中。 * LinkedList * 基于链表,内存存储不是连续的 * 随机访问较慢,因为内存存储不是连续的,没法通过下标计算找到想要寻找的元素,所以在查找时,需要通过链表一个一个去遍历,才能找到,需要寻找的元素 * 头尾插入删除性能较高,而中间位置的插入删除,非常慢,因为插入需要先执行查询,找到指定的位置,然后再去执行添加,而LinkedList执行查询的效率非常的慢,综合下来,再中间部分执行插入时,效率反而会比ArrayList慢很多 * 占用内存比较多,因为LinkedList是由一个一个的Node对象组成,每个Node对象中又存储了头节点和尾节点和数据,所以先对于ArrayList的内存占用会高很多
相关 Java集合框架详解:ArrayList和LinkedList的对比 在Java集合框架中,ArrayList和LinkedList是两种常见的动态数组。它们各有特点,适用于不同的场景。 1. ArrayList: - **优点**: - 不念不忘少年蓝@/ 2024年10月21日 14:21/ 0 赞/ 19 阅读
相关 Java中ArrayList和LinkedList性能对比 在Java中,ArrayList和LinkedList都是动态数组,但它们在存储、插入和删除操作上的性能存在显著差异。 1. **存储效率**: - ArrayList 向右看齐/ 2024年09月27日 11:03/ 0 赞/ 62 阅读
相关 Java中ArrayList和LinkedList性能对比 在Java中,ArrayList和LinkedList都是常用的动态数组。它们的主要区别在于元素的插入和删除位置。 1. **ArrayList**: - 插入:在末尾添加时 浅浅的花香味﹌/ 2024年09月24日 19:03/ 0 赞/ 56 阅读
相关 ArrayList和LinkedList性能对比 ArrayList和LinkedList性能对比 ?前言??博客:【无聊大侠hello word】?✍有一点思考,有一点想法,有一点理性!✍✍本文由在下【无聊大侠hel... 小灰灰/ 2024年05月03日 14:34/ 0 赞/ 69 阅读
相关 【2023】ArrayList和LinkedList详解介绍对比 一、ArrayList 1、概述 ArrayList是实现了List接口的动态数组,所谓动态数组就是他的大小是可变的。实现了所有可选列表操作,并允许包括Null在内 客官°小女子只卖身不卖艺/ 2024年03月17日 23:29/ 0 赞/ 78 阅读
相关 【2023】ArrayList和LinkedList详解介绍对比 一、ArrayList 1、概述 ArrayList是实现了List接口的动态数组,所谓动态数组就是他的大小是可变的。实现了所有可选列表操作,并允许包括Null在内 た 入场券/ 2023年10月13日 21:43/ 0 赞/ 1 阅读
相关 Java的ArrayList和LinkedList的对比 LinkedList和ArrayList的对比 老生常谈的问题了,顺便在这里就把LinkedList的优缺点也给讲了。 1. 顺序插入速度ArrayList会比较快, 我就是我/ 2022年07月13日 03:24/ 0 赞/ 157 阅读
相关 ArrayList和LinkedList的对比 List数据结构在实际开发中是非常常见的,其中Arraylist和LinkedList又是这种数据结构中最常见的,本篇文章将会从不同角度来记录讲解这两种list的实现方式及优缺 ╰+哭是因爲堅強的太久メ/ 2022年02月20日 10:09/ 0 赞/ 234 阅读
相关 Java集合(六)--ArrayList、LinkedList和Vector对比 在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这: [Java集合(五)--LinkedList源码解读][Java_--LinkedList] 约定不等于承诺〃/ 2021年11月05日 12:38/ 0 赞/ 334 阅读
还没有评论,来说两句吧...