ArrayList底层结构和源码分析以及Vector 底层结构和源码分析

举报
荞慧子 发表于 2022/12/31 19:37:03 2022/12/31
【摘要】 ArrayList底层结构和源码分析ArrayList的注意事项(1)permits all elements , including null , ArrayList可以加入null,并且多个(2)ArrayList是由数组来实现数据存储的(3)ArrayList基本等同于Vector,出了ArrayList是线程不安全(执行效率高)看源码,在多线程情况下,不建议使用ArrayListAr...

ArrayList底层结构和源码分析

ArrayList的注意事项

(1)permits all elements , including null , ArrayList可以加入null,并且多个

(2)ArrayList是由数组来实现数据存储的

(3)ArrayList基本等同于Vector,出了ArrayList是线程不安全(执行效率高)看源码,在多线程情况

下,不建议使用ArrayList

ArrayList 的底层操作机制源码分析

(1)ArrayList中维护了一个Object类型的数组elementData。

transient Object[] elementData; //transient 表示瞬间,短暂的,表示该属性不会被序列号
复制代码

(2)当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData的容量为0,第一次添

加,则扩容elementDate为10,如需要再次扩容,则扩容elementData为1.5倍。

(3)如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩

容elementData为1.5倍。


解读源码

import java.util.ArrayList;

@SuppressWarnings({"all"})
public class ArrayListSource {
    public static void main(String[] args) {

        //Idea 默认情况下,Debug 显示的数据是简化后的,如果希望看到完整的数据
        //需要做设置. //使用无参构造器创建 ArrayList 对象
        //ArrayList list = new ArrayList();
        ArrayList list = new ArrayList(8);
        //使用 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);
    }
}

Vector 底层结构和源码分析

Vector 的基本介绍

(1)Vector类的定义说明

public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
复制代码

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

(3)Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized

public synchronized E get(int index) {
    if(index >= elementCount) 
        throw new ArrayIndexOutOfBoundsException(index);
    return elementData(index);
}
复制代码

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

解读源码


import java.util.Vector;
@SuppressWarnings({"all"})
public class Vector_ {
    public static void main(String[] args) {
    //无参构造器
    //有参数的构造
    Vector vector = new Vector(8);
    for (int i = 0; i < 10; i++) {
        vector.add(i);
    }
    vector.add(100);
    System.out.println("vector=" + vector);

    //1. new Vector() 底层
    /*
    public Vector() {
        this(10);
    }
    补充:如果是 Vector vector = new Vector(8);
    走的方法:
    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }
    
    2. vector.add(i)
    2.1 //下面这个方法就添加数据到 vector 集合
    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }
    2.2 //确定是否需要扩容 条件 : minCapacity - elementData.length>0
    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    2.3 //如果 需要的数组大小 不够用,就扩容 , 扩容的算法
    //newCapacity = oldCapacity + ((capacityIncrement > 0) ?
    // capacityIncrement : oldCapacity);
    //就是扩容两倍. private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
    capacityIncrement : oldCapacity);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
        }
    */
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。