当前位置: 首页 > news >正文

java基础概念47-ArrayList、LinkList和迭代器

一、ArrayList集合

1-1、ArrayList的两种添加信息的方式

1-2、ArrayList集合底层逻辑

1、利用空参创建的集合,在底层创建一个默认长度为0的数组

2、添加第一个元素时,底层会创建一个新的长度为10的数组

3、存满时,会扩容1.5倍。

4、如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准。

二、LinkedList集合

 

2-1、LinkedList的特有API

LinkedList中的Node源码:

ListedList在任意位置插入元素:

import java.util.LinkedList;public class LinkedListInsertExample {public static void main(String[] args) {// 创建LinkedList并添加初始元素LinkedList<String> list = new LinkedList<>();list.add("A");list.add("B");list.add("C");// 打印插入前的链表:插入前的链表: [A, B, C]System.out.println("插入前的链表: " + list);// 在索引位置1插入元素"X"list.add(1, "X");// 打印插入后的链表:插入后链表: [A, X, B, C]System.out.println("插入后链表: " + list);}
}

2-2、ArrayList VS LinkedList

就整体使用频率而言,ArrayList通常比LinkedList更为常用

1、ArrayList的常用性及其原因

  1. 随机访问性能优越
    • ArrayList基于数组实现,支持O(1)时间复杂度的随机访问
    • 在需要频繁访问列表中元素(如通过索引获取元素)的场景中,ArrayList具有显著优势。
  2. 动态扩容方便
    • ArrayList提供了动态扩容的功能,能够根据需要自动调整大小。(1.5倍)
    • 这使得ArrayList在存储动态输入数据时更加灵活和方便。

进行排序合并等操作时,ArrayList都是首选的数据结构。

2、LinkedList的适用场景及其局限性

  1. 插入和删除性能优越
    • LinkedList基于链表实现,支持O(1)时间复杂度的在任意位置插入和删除元素(前提是已知要插入或删除元素的位置)。
    • 然而,在不知道位置的情况下,LinkedList的插入和删除操作需要遍历列表,时间复杂度为O(n)。
  2. 内存占用较大
    • 由于LinkedList中的每个元素都需要存储一个指向下一个元素的引用,因此其内存占用通常比ArrayList大。

 LinkedList更适用于需要频繁在任意位置插入和删除元素的场景。

三、迭代器(Iterator)

3-1、迭代器(Iterator)源码

3-2、迭代器(Iterator)的ConcurrentModificationException(并发修改异常)

Java集合框架中的大多数集合类(如ArrayListHashSet等)都有一个内部计数器modCount,用于记录集合被修改的次数。每当集合的结构发生变化(如添加、删除元素),modCount就会增加。

迭代器在创建时,会保存一个创建时的expectedModCount,这是迭代器期望的集合修改次数。在迭代过程中,每次调用next方法时,迭代器都会检查当前集合的modCount是否与expectedModCount相等。如果不相等,说明集合在迭代过程中被修改了(不是通过迭代器自身的remove方法),此时就会抛出ConcurrentModificationException

结论:在以后如何避免并发修改异常?

在使用迭代器或者是增强for遍历集合的过程中,不要使用集合的方法去添加或者删除元素即可。

http://www.lryc.cn/news/496950.html

相关文章:

  • Delphi 12.2.1 idhttpserver的使用方法
  • 【golang】单元测试,以及出现undefined时的解决方案
  • jmeter 压测常用静默参数解释应用
  • 【开源】A059-基于SpringBoot的社区养老服务系统的设计与实现
  • 《智能体雏形开发(高阶实操)》开发计划概述
  • QT学习笔记-QStringList,QTimer
  • 如何使用brew安装phpredis扩展?
  • 游戏引擎学习第25天
  • 多线程运行时,JVM(Java虚拟机)的内存模型
  • kernel crash数据解析
  • CLIP模型也能处理点云信息
  • 利用若依代码生成器实现课程管理模块开发
  • 用Python做数据分析环境搭建及工具使用(Jupyter)
  • SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD
  • linux环境人大金仓数据库修改密码
  • 使用ESP32通过Arduino IDE点亮1.8寸TFT显示屏
  • Spring Cloud Alibaba(六)
  • 【包教包会】CocosCreator3.x——重写Sprite,圆角、3D翻转、纹理循环、可合批调色板、不影响子节点的位移旋转缩放透明度
  • jupyter-lab 环境构建
  • 【C++】LeetCode:LCR 026. 重排链表
  • 【Linux】vim编辑器
  • delphi 12 idhttpsever(S)+idhttp(C) 实现简单的JSON API服务
  • JVM 主副内存 详解
  • sscanf与sprintf函数
  • 【k8s】创建基于sa的token的kubeconfig
  • Gentoo Linux部署LNMP
  • 2411C++,CXImage简单使用
  • 什么是 Kubernetes(K8s)?
  • 深入解析:TypeScript 与 Vue 的完美结合
  • 机器学习周志华学习笔记-第13章<半监督学习>