zoukankan      html  css  js  c++  java
  • Java基础之:List——ArrayList & Vector

    Java基础之:List——ArrayList & Vector

     

     

    ArrayList简单介绍

    ArrayList实现了List接口,底层是一个数组,并实现了可变的功能。底层属性(transient Object[] elementData;)在序列化时,忽略该属性。

    ArrayList实现了List接口,所以它可以允许出现重复值,也可以使用List中的所有方法。

    ArrayList与Vector基本相同,ArrayList是线程不安全的,但比Vector效率更高。

    ArrayList底层源码分析

    1. ArrayList底层维护了一个Object类型的数组elementData。(transient Object[] elementData;)

    2. 当创建对象时,如果是用的是无参构造器public ArrayList(),则默认初始化elementData容量为0。

    3. 当添加元素时:先判断是否有足够的容量进行添加,若不够则进行扩容,调用grow()方法,若足够则直接在对应位置添加元素即可。

    4. 在使用无参构造public ArrayList()的情况下第一次扩容默认为10,之后再需要扩容的话,则扩容elementData为1.5倍,即10 + 10 / 2 = 15

    5. 若使用有参构造public ArrayList(int initialCapacity),则默认初始化elementData容量为initialCapacity。那么在第一次扩容时,则直接扩容elementData到1.5倍initialCapacity。

    源码追踪

    img

    代码说明:

    package class_ArrayList;
    import java.util.ArrayList;
    public class ClassTest01_Debug {
    ​
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public static void main(String[] args) {
            ArrayList arrayList = new ArrayList();
            
            for(int i = 0 ; i < 10;i++) {
                //这里添加第一个元素时,将arrayList进行扩容,默认扩容为10
                arrayList.add("hello" + i); 
            }
            
            for(int i = 0 ; i < 5;i++) {
                //这里添加元素时,已经是arrayList的第11个位置,再次对其扩容,10 + 10 / 2  = 15
                arrayList.add("hello" + i);
            }
            
            //这里添加元素时,已经是arrayList的第16个位置,再次对其扩容,即15 + 15 / 2 = 22
            arrayList.add("hi01");
            arrayList.add("hi02");
            arrayList.add("hi03");
        }
    }

     

    Vector简单介绍

    public class Vector<E> extends AbstractList<E>

    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

     

    Vector底层也是一个可变对象数组( protected Object[] elementData;)。

    Vector是线程安全的,Vector类的操作方法都带有synchronized:

      public synchronized boolean add(E e) {

        modCount++;

        ensureCapacityHelper(elementCount + 1);

        elementData[elementCount++] = e;

        return true;

      }

    由于Vector使用方法基本上和ArrayList没有差别,所以这里就不再赘述。

     

    ArrayList与Vector比较

    在实际开发中,使用更多的还是ArrayList,只有在确实需要线程同步安全时,才考虑使用Vector。

     

  • 相关阅读:
    获取声音设备名称及PNPDeviceID
    定时音乐播放
    获取多媒体详细信息列表
    产品滚动展示
    制作电影特效效果
    十字光标定位
    获取指定点的RGB值
    绘画小游戏
    倒影效果文字
    浮雕效果显示图像
  • 原文地址:https://www.cnblogs.com/SongHai/p/14191425.html
Copyright © 2011-2022 走看看