• 集合—Vector底层结构和源码分析


    本次博客带领大家学习集合中的Vector底层结构和源码分析。

    Vector的基本介绍

    1. Vector类的定义说明
      请添加图片描述
    2. Vector底层也是一个对象数组,protected Object[] elementData;
    3. Vector 是线程同步的,即线程安全,Vector类的操作方法带有synchronized。
    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 在开发中,需要线程同步安全时,考虑使用Vector。

    Vector和ArrayList的比较

    底层结构版本线程安全(同步)效率扩容倍数
    ArrayList可变数组jdk1.2不安全,效率高如果有参构造1.5倍;如果是无参,第一次扩容10,第二次开始按1.5倍扩
    Vector可变数组jdk1.0安全,效率不高如果有参构造2倍,如果是无参,第一次扩容10,第二次开始按2倍扩

    Vector 扩容源码分析

    1. new Vector() 底层,其实就是直接传入10给有参构造器。
    public Vector() {
        this(10);
    }
    
    • 1
    • 2
    • 3
    1. 下面这个方法就添加数据到vector集合。
    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 确定是否需要扩容 条件 :minCapacity - elementData.length > 0。
    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 如果需要的数组大小不够用,就需要扩容。
    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);
    }
    inCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    计算机网络:数据链路层设备 网桥与交换机
    echarts多个关系图如何实现
    C++的爬山算法
    FPGA与CPU进行数据通信有哪些方法?
    3.2 网络协议
    SpringMVC基础:注解获取请求相关参数
    springboot引入第三方jar包放到项目目录中,添加web.xml
    SSH工具:Xshell正版官方免费版下载,不限制站点数量
    数字集成电路设计(一、Verilog HDL数字集成电路设计方法概述)
    思腾云计算
  • 原文地址:https://blog.csdn.net/lidong777777/article/details/126017620