谈谈ArrayList与Vector的理解?

目录

扩容机制

ArrayList扩容源码

Vector扩容源码

二者区别

[扩展:stack(栈)](#扩展:stack(栈))

1.创建stack对象

[2. 入栈(先进后出)](#2. 入栈(先进后出))

3.出栈

扩展:举个例子:实现下字符串逆置,利用stack栈来实现。


从接口实现上,ArrayList与Vector都是基于动态数组实现的List接口的集合实现类。

扩容机制

ArrayList扩容源码

复制代码
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
  • 当传入的是无参构造时候,add(11)个元素时候,会进行扩容,新容量为oldCapacity>>1+oldCapacity;
  • 当传入的是带参构造,扩容时候,会按照它的传入的扩容容量+扩容容量<<1进行计算;

Vector扩容源码

复制代码
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);
}
复制代码
Vector 的无参构造,数组的初始化容量为10,每次扩容不足,扩容为原来的二倍
复制代码
初始化提供数组的初始化容量和每次的扩容值,当容量不足时候,已指定扩容值进行扩容操作

二者区别

初始容量:

  1. ArrayList初始默认容量为0,添加一个元素时候,扩容为10;
  2. Vector 初始容量为10;

扩容方式:

  1. ArrayList:在原有容量基础上,扩容1.5倍。
  2. Vector:在原有容量基础上,扩容2倍。

线程安全:

  1. ArrayList:线程不安全(可使用CopyWriteArrayList集合解决)
  2. Vector:线程安全,操作方法使用sychronized(同步锁)实现线程同步。

执行效率:

  1. Vector的方法加入了同步锁,实现线程安全,所以在方法执行时许加锁,释放锁,产生额外的性能开销,所以Vector性能会低于ArrayList.

    // 栈 先进后出
    Stack stack = new Stack<>();
    // 入栈
    stack.push("张三");
    stack.push("李四");
    stack.push("王五");
    System.out.println(stack);
    // 获取到栈顶元素,并让栈顶元素出栈
    // String item = S1.POP();
    // 获取栈顶元素,元素不出栈。
    String item = stack.peek();
    System.out.println(item);
    System.out.println(stack);

    复制代码
         // 字符串逆置
    
         System.out.println(reverse("abcdefg"));
     }
     public static String reverse(String str){
         Stack<Character> stack = new Stack<>();
    
         // 字符串中的元素入栈
         char[] c1 = str.toCharArray();
         for (char c : c1){
             stack.push(c);
         }
         StringBuilder sb = new StringBuilder();
    
         // 出栈
         while (!stack.isEmpty()){
             sb.append(stack.pop());
         }
         return sb.toString();
     }

扩展:stack(栈)

1.创建stack对象

复制代码
        Stack<Character> stack = new Stack<>();

2. 入栈(先进后出)

复制代码
        stack.push("张三");

3.出栈

复制代码
        // 获取到栈顶元素,并让栈顶元素出栈
        // String item = S1.pop();


        // 获取栈顶元素,元素不出栈。
        String item = stack.peek();

扩展:举个例子:实现下字符串逆置,利用stack栈来实现。

复制代码
public static String reverse(String str){
        Stack<Character> stack = new Stack<>();

        // 字符串中的元素入栈
        char[] c1 = str.toCharArray();
        for (char c : c1){
            stack.push(c);
        }
        StringBuilder sb = new StringBuilder();

        // 出栈
        while (!stack.isEmpty()){
            sb.append(stack.pop());
        }
        return sb.toString();
    }
相关推荐
:-)3 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
Jerry7 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发8 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星8 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮8 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home84078 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>9 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC9 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC10 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师10 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法