• day19--Java集合02


    Java集合02

    6.ArrayList

    ArrayList的注意事项:

    1. Permits all element , including null ,ArrayList 可以加入null ,并且可以加入多个
    2. ArrayList是由数组来实现数据存储的
    3. ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)而Vector是线程安全的。在多线程情况下,不建议使用ArrayList

    例子1:ArrayList 可以加入null ,且可以加入多个null

    package li.collections.list.arraylist;
    import java.util.ArrayList;
    public class ArrayListDetail {
    @SuppressWarnings("all")
    public static void main(String[] args) {
    ArrayList arrayList = new ArrayList();
    arrayList.add(null);
    arrayList.add("jack");
    arrayList.add(null);
    System.out.println(arrayList);//[null, jack, null]
    }
    }

    6.1ArrayList源码分析

    ArrayList构造器:

    image-20220810180055374
    1. ArrayList中维护了一个Object类型的数组elementData
    transient Object[] elementData; // transient 表示瞬间,短暂的,表示该属性不会被序列化
    1. 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则elementData扩容为10,再次扩容则扩成elementData当前容量的1.5倍

    2. 如果使用的是在指定大小的构造器,则初始elementData的容量为指定大小,再次扩容则同样扩成elementData当前容量的1.5倍

    例子:使用无参构造器

    package li.collections.list.arraylist;
    import java.util.ArrayList;
    public class ArrayListSource {
    @SuppressWarnings("all")
    public static void main(String[] args) {
    //使用无参构造器创建ArrayList对象
    ArrayList list = new ArrayList();
    //使用for循环给list集合添加1-10数据
    for (int i = 1; i < 10; i++) {
    list.add(i);
    }
    //使用for循环给list集合添加11-15数据
    for (int i = 11; i <= 15; i++) {
    list.add(i);
    }
    list.add(100);
    list.add(200);
    list.add(null);
    }
    }

    过程如下:

    20220811038349583467

    例子2:使用指定大小的构造器

    image-20220811174524435

    如果是有参函数的构造器,扩容机制:

    (1)第一次扩容,就按照elementData的1.5倍扩容

    (2)整个执行的流程还是和前面讲的一样

    7.Vector

    vector的基本介绍:

    1)Vector类的定义说明

    image-20220811182031493

    2)Vector底层也是一个对象数组,protected Object[] elementData;

    1. Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized

    4)在研发中,需要线程同步安全时,考虑使用Vector

    7.1Vector源码分析

    例子:

    package li.collections.list.vector;
    import java.util.Vector;
    public class VectorTest {
    @SuppressWarnings("all")
    public static void main(String[] args) {
    Vector vector = new Vector();
    for (int i = 0; i < 10; i++) {
    vector.add(i);
    }
    }
    }
    image-20220811183617715
    1. 点击this,光标跳转到有参的构造器中,可以看出传入的initialCapacity是10 ,即调用无参构造器,默认初始容量就是10
    image-20220811183649893
    1. vector.add()方法

      ​ 2.1下面这个方法添加数据到vector集合

      image-20220811185256494

      ​ 2.2 确定是否需要扩容 条件:minCapacity - elementData.length >0

    image-20220811232607919

    ​ 2.3 如果需要的数组大小不够用,就扩容,扩容的算法:

    newCapacity = oldCapacity + ((capacityIncrement > 0) ?
    capacityIncrement : oldCapacity);
    image-20220811232649875

    Vector底层结构和ArrayList的比较

    底层结构 版本 线程安全(同步)效率 扩容倍数
    ArrayList 可变数组 jdk1.2 不安全,效率高 如果有参构造则为1.5倍;如果无参第一次为10,第二次及以后则按1.5倍
    Vector 可变数组 jdk1.0 安全,效率不高 如果是无参,默认10,满后就按两倍扩容;如果指定大小,则每次按两倍扩
  • 相关阅读:
    为华生物COOH-PEG-COOH聚乙二醇二羧酸的简介及应用说明
    .NET性能优化-推荐使用Collections.Pooled
    css溢出隐藏的五种方法
    mongodb 数据块的迁移流程介绍
    中部高标准农田建设大会将于2024年8月在郑州召开
    JavaScript实现MD5加密的6种方式
    vuex基础
    java生成pdf表格并支持下载可选另存为
    【算法|动态规划No.21】leetcode494. 目标和
    基于Google Vertex AI 和 Llama 2进行RLHF训练和评估
  • 原文地址:https://www.cnblogs.com/liyuelian/p/16578338.html