Java的List集合框架之Vector详细解析

 更新时间:2023年11月16日 09:53:25   作者:进击的猫  
这篇文章主要介绍了Java的List集合框架之Vector详细解析,List接口继承Collection,Collection继承于Iterable,List接口实现类分为Vector、ArrayList、LinkedList,Vector底层是一个Object数组,需要的朋友可以参考下

(一)List子父层级:

Vector继承关系

  • List接口继承Collection,Collection继承于Iterable;
  • List接口实现类分为:Vector、ArrayList、LinkedList;

(二)List实现类——Vector

1、Vector实现类

(1)Vector底层是一个Object数组,protected Object[] elementData;

(2)Vector中的所有涉及到Object数组的均是会加synchronized,列举常见方法:构造方法、add、remove、get、set等

(3)Vector中的默认容量为10,且扩容默认为当前容量翻倍(直接相加或者构造方法中指定扩容大小)。

2、常见源码:

(1)构造方法:

//无参构造
 public Vector() {
        this(10);//默认大小为10
    }

//初始化指定大小的有参构造方法
        public Vector(int initialCapacity) {
            this(initialCapacity, 0);
        }

//指定扩容大小和初始值的有参构造   
public Vector(int initialCapacity, int capacityIncrement) {
    super();//父类无参构造
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];//实例化存储数组
    this.capacityIncrement = capacityIncrement;//设置自动扩容大小
}

(2)add方法:

/*
* 此处列举的直接末尾添加add方法,还有指定位置添加insertElementAt方法添加,操作数组均会在方法上添加synchronized锁
**/
public synchronized boolean add(E e) {
    modCount++;//操作次数
    ensureCapacityHelper(elementCount + 1);//是否需要扩容
    elementData[elementCount++] = e;//存储数据
    return true;
}
//扩容判定
private void ensureCapacityHelper(int minCapacity) {
 if (minCapacity - elementData.length > 0)//判定是否需要扩容,当前存入值已大于数组大小
     grow(minCapacity);//调用扩容方法
}

//数组最大值,使用Integer最大值2147483648-8,因数组需要存自身的元数据占用8位(Class\Lock\Flag\Size)
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

//扩容方法
private void grow(int minCapacity) {
    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);//数组迁移复制
}
//存储最大值判定,超出限制则默认使用最大值
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) //越界
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE)?Integer.MAX_VALUE:MAX_ARRAY_SIZE;//返回最大值或者数组最大值
}

(3)remove方法:

/*
* 此处列举的返回boolean值的删除方法,还有直接删除指定索引的remove,
* 它直接在方法上添加synchronized锁,逻辑与具体删除一致
**/
public boolean remove(Object o) {
    return removeElement(o);//调用具体删除方法
}

public synchronized boolean removeElement(Object obj) {
    modCount++;//操作次数
    int i = indexOf(obj);//获取obj在数组中存储的下标,防止数组越界
    if (i >= 0) {
        removeElementAt(i);//调用删除方法
        return true;
    }
    return false;
}
//索引寻找
public int indexOf(Object o) {
    return indexOf(o, 0);//传入需要比对值和数组首标
}
//遍历数组寻找指定值(找寻下标,防止线程不安全,加synchronized)
public synchronized int indexOf(Object o, int index) {
    if (o == null) {//判定传入是否为空
        for (int i = index ; i < elementCount ; i++)
            if (elementData[i]==null)
                return i;//返回数组下标第一个为null的索引
    } else {
        for (int i = index ; i < elementCount ; i++)
            if (o.equals(elementData[i]))//判定需要删除值与数组值是否相等,相等则返回第一个相等的下标
                return i;//返回索引值
    }
    return -1;
}
//根据索引对指定下标进行删除(与存储数组进行交互,添加synchronized锁)
public synchronized void removeElementAt(int index) {
    modCount++;//操作次数
    if (index >= elementCount) {//越界判定
        throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                 elementCount);
    }else if (index < 0) {//越界判定
        throw new ArrayIndexOutOfBoundsException(index);
    }
    int j = elementCount - index - 1;//计算需要被迁移的数组成员数量
    if (j > 0) {
        //使用系统类提供的数组复制方法进行迁移复制
        //参数说明:被复制的数组,被复制的数组起点下标,目标数组(复制到的新数组),目标数组被复制的起点下标,需要复制的大小
        System.arraycopy(elementData, index + 1, elementData, index, j);
    }
    elementCount--;//成员数量减1
    //将原来存储有值的最后一位值置为空,便于GC回收工作,提高内存使用率
    elementData[elementCount] = null;
}

(4)get方法:

public synchronized E get(int index) {
     if (index >= elementCount)//越界控制
         throw new ArrayIndexOutOfBoundsException(index);
     return elementData(index);
 }
 //返回指定数组值
 E elementData(int index) {
     return (E) elementData[index];
 }

(5)set方法:

public synchronized E set(int index, E element) {
   if (index >= elementCount)//越界控制
        throw new ArrayIndexOutOfBoundsException(index);
    E oldValue = elementData(index);//获取索引已存在的值或者null
    elementData[index] = element;//设置新值
    return oldValue;//返回设置之前的索引数组值
}

3、总结

(1)Vector是线程安全的,每个涉及到存储数据的方法都添加synchronized锁,性能相对会较低;

(2)Vector默认的存储大小为10,不指定自动扩容大小,则默认使用当前数组大小进行自加扩容(直接相加或者构造方法中指定扩容大小);      

到此这篇关于Java的List集合框架之Vector详细解析的文章就介绍到这了,更多相关List集合框架之Vector内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Web项目中使用Socket通信多线程、长连接的方法

    Java Web项目中使用Socket通信多线程、长连接的方法

    很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听。接下来通过本文给大家介绍Java Web项目中使用Socket通信多线程、长连接的方法,感兴趣的朋友一起学习
    2016-04-04
  • Spring Boot 使用 Disruptor 做内部高性能消息队列

    Spring Boot 使用 Disruptor 做内部高性能消息队列

    这篇文章主要介绍了Spring Boot 使用 Disruptor 做内部高性能消息队列,工作中遇到项目使用Disruptor做消息队列,对你没看错,不是Kafka,也不是rabbitmq。Disruptor有个最大的优点就是快,还有一点它是开源的哦,下面做个简单的记录
    2022-06-06
  • Java开发人员最常犯的5个错误总结

    Java开发人员最常犯的5个错误总结

    作为一名java开发程序员,不知道大家有没有遇到过一些匪夷所思的bug。这些错误通常需要您几个小时才能解决。今天,小编总结一些常见的编码错误,然后给出解决方案。希望大家在日常编码中能够避免这样的问题
    2022-12-12
  • SpringBoot加载bean的八种方式总结

    SpringBoot加载bean的八种方式总结

    springboot难免要用到bean,但这些bean如何导入,对于初学者时间头疼的事,下面这篇文章主要给大家介绍了关于SpringBoot加载bean的八种方式,需要的朋友可以参考下
    2022-10-10
  • Spring MVC InitBinder验证方法

    Spring MVC InitBinder验证方法

    这篇文章主要介绍了Spring MVC InitBinder验证方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 详解SpringBoot中的统一功能处理的实现

    详解SpringBoot中的统一功能处理的实现

    这篇文章主要为大家详细介绍了SpringBoot如何实现统一功能处理,文中的示例代码讲解详细,对我们学习或工作有一定借鉴价值,需要的可以参考一下
    2023-01-01
  • java web图片上传和文件上传实例

    java web图片上传和文件上传实例

    本篇文章主要介绍了java web图片上传和文件上传实例,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • 使用maven对springboot项目进行瘦身分离jar的多种处理方案

    使用maven对springboot项目进行瘦身分离jar的多种处理方案

    springboot项目打包一般我们都使用它自带的spring-boot-maven-plugin插件,这个插件默认情况下,会把所有的依赖包全部压缩到一个jar里面,今天给大家分享几种方案来如何减小我们的打包文件,需要的朋友可以参考下
    2024-02-02
  • Java获取文件ContentType案例

    Java获取文件ContentType案例

    这篇文章主要介绍了Java获取文件ContentType案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 使用Fastjson进行JSON生成与解析的新手指南

    使用Fastjson进行JSON生成与解析的新手指南

    Fastjson是阿里巴巴开源的高性能 JSON 库,适用于 Java 对象的序列化和反序列化,本文将详细介绍一下如何使用Fastjson进行json的生成与解析吧
    2025-04-04

最新评论