码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JAVA集合框架(一)-ARRAYLIST


    1、ArrayList的特点

    存放的元素有序
    元素不唯一(可以重复)
    随机访问快
    插入删除元素慢
    非线程安全

    2、底层实现

    底层初始化,使用一个Object类型的空对象数组,初始长度为0;

    源码

    1. //Object类型对象数组引用
    2. transient Object[] elementData;
    3. //默认空的Object数组
    4. private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    5. //实例化时,将Object类型对象数组引用 指向 默认空的Object数组
    6. public ArrayList() {
    7. this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    8. }

    首次添加元素,自动进行扩容,默认扩充容量是10(数组的长度,也就是集合存放元素的个数);

    源码

    1. //如果是第一次添加元素
    2. public boolean add(E e) {
    3. //private int size; //size = 0;
    4. //调用ensureCapacityInternal(int minCapacity)方法
    5. ensureCapacityInternal(size + 1); // Increments modCount!!
    6. elementData[size++] = e;
    7. return true;
    8. }
    9. //minCapacity = 1;
    10. private void ensureCapacityInternal(int minCapacity) {
    11. //调用calculateCapacity(Object[] elementData, int minCapacity)方法
    12. ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    13. }
    14. private static int calculateCapacity(Object[] elementData, int minCapacity) {
    15. //判断是不是默认空的Object数组
    16. //如果是进入选择一个数组容量
    17. if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
    18. //private static final int DEFAULT_CAPACITY = 10;
    19. //minCapacity = 1;
    20. //所以第一次添加元素时,自动进行扩容,默认扩充容量是10
    21. return Math.max(DEFAULT_CAPACITY, minCapacity);
    22. }
    23. return minCapacity;
    24. }

    3、扩容

    • 当前一次扩容的数组容量不足时(放满10个元素,再想添加一个元素,容量不足),开始进行动态扩容;
    • 每次扩容,是之前一次扩容后的数组容量的1.5倍(即:每次都在前一次数组容量的基础上,增加一半-右移1位);
    • 最大容量Integer.MAX_VALUE - 8,即2^31-8;
    1. //扩容方法
    2. private void grow(int minCapacity) {
    3. // overflow-conscious code
    4. int oldCapacity = elementData.length; //旧数组的容量
    5. int newCapacity = oldCapacity + (oldCapacity >> 1); //新数组的容量 = 老数组的容量+老数组的一半(右移一位)
    6. if (newCapacity - minCapacity < 0)
    7. newCapacity = minCapacity;
    8. if (newCapacity - MAX_ARRAY_SIZE > 0) //如果新数组的容量大于最大值,将数组的容量设置为Integer.MAX_VALUE - 8
    9. newCapacity = hugeCapacity(minCapacity);
    10. // minCapacity is usually close to size, so this is a win:
    11. elementData = Arrays.copyOf(elementData, newCapacity);
    12. }
    13. private static int hugeCapacity(int minCapacity) {
    14. if (minCapacity < 0) // overflow
    15. throw new OutOfMemoryError();
    16. //private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    17. return (minCapacity > MAX_ARRAY_SIZE) ?
    18. Integer.MAX_VALUE :
    19. MAX_ARRAY_SIZE;
    20. }

    4、ArrayList初始化

    基于多态创建ArrayList集合对象

    1. List list = new ArrayList<>(); // 推荐
    2. Collection collection = new ArrayList();
    3. ArrayList arrayList = new ArrayList();
    4. List intList = new ArrayList<>(); //可以使用泛型,指定存放数据的类型
    5. 5、常用方法

      方法说明
      add(Object obj)添加元素
      add(int index, E element)指定下标添加元素
      remove(int index)移除元素
      get(int index))获取元素
      size()集合元素个数
      contains(Object o)是否包含某元素
      isEmpty()集合是否为空

      5.1 add(Object obj)

      1. //添加元素方法:add(Object obj),每次添加元素都是自动添加到数组的末尾,元素下标值从0开始,跟数组一致;
      2. //可以添加重复值;
      3. //可以添加null值;

      5.2 add(int index, E element)

      //指定下标添加元素和删除元素,执行效率比较低;

      5.3 remove(int index)

      // 根据下标删除,如果重复,只能删除第一个出现的;
      

      5.4 get(int index))

      1. // 获取元素方法:get(下标值),只能通过下标取值;
      2. //当访问下标值超出了集合元素的最大下标值,报下标越界异常:java.lang.IndexOutOfBoundsException
      3. // 可用的下标值的范围:最小值是0,最大值是集合元素的个数 - 1

      5.5 size()

      // 获取集合中元素个数方法:size();
      

      5.6 contains(Object o)

      // 判断list集合中,是否包含某个元素方法:contains(查找元素值),返回true,代表存在,返回false,代表不存在;
      

      5.7 isEmpty()

      1. // 判断list集合是否为空方法:isEmpty(),返回true代表没有元素,空的,返回false,代表有元素,不是空的
      2. // 底层就是通过集合中元素个数size == 0 判断,所以也可以使用size() == 0判断集合非空

      源码

      1. public boolean isEmpty() {
      2. return size == 0;
      3. }

      5.8 clear()

      //清空list集合方法:clear(),清除集合中的所有元素
      

      源码

      1. ublic void clear() {
      2. modCount++;
      3. // clear to let GC do its work
      4. for (int i = 0; i < size; i++) //一次将数组赋值为null;
      5. elementData[i] = null;
      6. size = 0; //设置数组长度为0;
      7. }

      5.9 toArray()

      // list集合一步转换为数组方法:toArray(),返回的是Object类型数组
      

      6、数组转换成集合

      Arrays.asList(目标数组)

      1. String[] strArrays = {"奥迪", "奔驰", "宝马"};
      2. List<String> strList1 = Arrays.asList(strArrays);
      3. System.out.println(strList1); //[奥迪, 奔驰, 宝马]

      7、遍历

      1. List strList = new ArrayList<>();
      2. strList.add("Audi");
      3. strList.add("Benz");
      4. strList.add("Bmw");
      5. strList.add("Audi");
      6. //for循环
      7. for (int i = 0; i < strList.size(); i++) {
      8. System.out.println("汽车品牌:" + strList.get(i));
      9. }
      10. //迭代器
      11. //Iterator迭代器,只能通过集合获取,不可以重复使用,迭代结束,迭代器就失效,如果想再次使用,需要重新获取
      12. Iterator iterator = strList.iterator();
      13. // 迭代器遍历,使用while,不知道其中元素个数
      14. while(iterator.hasNext()){
      15. System.out.println("汽车品牌:" + iterator.next());
      16. }

      运行结果:

      1. 汽车品牌:Audi
      2. 汽车品牌:Benz
      3. 汽车品牌:Bmw
      4. 汽车品牌:Audi

      8、Vector(线程安全)

      • Vector,底层数据结构是和ArrayList一致的,都是对象数组,但是它的操作是线程安全的,每个方法都带有synchronized同步;
      • 默认初始容量是10,可以自定义,但是不能小于0,默认每次扩容是前一次容量的一倍,扩容的数量也是可以指定的,如果指定,每次都是在前一次基础上扩容指定的数量
    6. 相关阅读:
      【Windows网络编程】二.TCP套接字编程与主机上线实验
      数据结构之链表(算法之初)
      Mysql事务日志
      Shell命令切换root用户、管理配置文件、检查硬件
      跨平台应用开发进阶(四十五)uni-app自定义组包app:checkReleaseDuplicateClasses问题分析及解决
      猿创征文|一篇打通架构设计,Java设计模式10,建造者模式
      【自动控制原理】时域分析法:稳定性分析(稳)、误差分析和计算(准)
      Pinia 与 Vuex 使用区别
      “轻松实现文件夹批量重命名:使用顺序编号批量改名“
      【软件测试】APP 上架指南:iOS App Store 首次上架被拒原因分析与解决方案
    7. 原文地址:https://blog.csdn.net/Firstlucky77/article/details/126003546
      • 最新文章
      • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
        用 Hashids 优雅解决 C 端自增 ID 暴露问题
        V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
        LLVM Pass快速入门(四):代码插桩
        milkup:桌面端 markdown AI续写和即时渲染
        基于项目工程构建SBOM(软件物料清单)的研究
        鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
        .NET 中如何快速实现 List 集合去重?
        扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
        浅谈数据访问层
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      小工具 小游戏
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

      京公网安备 11010502049817号