Java学习笔记-Collection-List

本文详细介绍了Java中List接口的四个实现类:ArrayList、Vector、Stack和LinkedList。讨论了它们的数据结构、操作复杂度、线程安全特性,并重点解析了ArrayList的线程不安全原因及遍历器的工作原理。对于Vector,其线程安全但性能较低。Stack基于ArrayList实现栈功能。而LinkedList则采用双向链表实现,适合大量插入删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整体类图

请添加图片描述

ArrayList

重要知识点

  • 底层数组存放数据,默认大小10,最大大小MAX_ARRAY_SIZEInteger.MAX_VALUE - 8, 每次扩容1.5倍(当然会有一些检查,扩容1.5倍之后还小于minCapacity,则使用minCapacity;超过最大大小,则使用hugeCapacity(minCapacity)等等)
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);
}
  • get、set复杂度O(1),add(E e)复杂度O(1),add(int index, E element)由于需要将index之后的数据后移一位,复杂度O(n), remove(int index)也是O(n)
  • 可以存放null
  • 线程不安全
  • 其他一些东西就比较简单了

线程不安全的原因

所有操作没有加锁所以线程不安全。

public Iterator<E> iterator() {
   
    return new Itr();
}

可见通过内部类实现了遍历器,所以在遍历ArrayList时(for遍历、Iterator遍历等等),实际上都是使用这个Itr
Itr的关键代码如下:

private class Itr implements Iterator<E> {
   
    int cursor;       // index of next element to return
    int lastRet = -1; // index of last element returned; -1 if no such
    int expectedModCount = modCount;

    Itr() {
   }

    public boolean hasNext() {
   
        return cursor != size;
    }

    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值