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。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值