浅谈List

本文深入探讨了Java中的List集合,重点关注ArrayList、LinkedList和CopyOnWriteArrayList。ArrayList基于数组实现,提供快速访问但插入删除较慢;LinkedList采用链表结构,插入删除高效但访问慢;CopyOnWriteArrayList在并发环境下确保线程安全,适合读多写少的场景。
摘要由CSDN通过智能技术生成

1. List集合

1.1 ArrayList

1.11 基本特点
  • ArrayList是一个实现了List接口的可变数组

  • 可以插入null

  • 它的size, isEmpty, get, set, iterator,add这些方法的时间复杂度是O(1),如果add n个数据则时间复杂度是O(n).

  • ArrayList不是synchronized的,所以线程不安全

  • 关注点 结论
    ArrayList是否为空 允许
    ArrayList是否允许重复数据 允许
    ArrayList是否有序 有序
    ArrayList是否线程安全 非线程安全
1.12 源码分析
  • 构造函数

      //默认容量
        private static final int DEFAULT_CAPACITY = 10;
      //空数组
        private static final Object[] EMPTY_ELEMENTDATA = {};
      //默认空数组
        private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
      //存放数据的数组
        transient Object[] elementData
    
        public ArrayList(int initialCapacity) {
          if (initialCapacity > 0) {
              this.elementData = new Object[initialCapacity];
          } else if (initialCapacity == 0) {
              this.elementData = EMPTY_ELEMENTDATA;
          } else {
              throw new IllegalArgumentException("Illegal Capacity: "+
                                                 initialCapacity);
          }
      }
    
      public ArrayList() {
          this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
      }
    
      public ArrayList(Collection<? extends E> c) {
          elementData = c.toArray();
          if ((size = elementData.length) != 0) {
              // c.toArray might (incorrectly) not return Object[] (see 6260652)
              if (elementData.getClass() != Object[].class)
                  elementData = Arrays.copyOf(elementData, size, Object[].class);
          } else {
              // replace with empty array.
              this.elementData = EMPTY_ELEMENTDATA;
          }
      }
  • add方法

    1. 去add后的大小和默认值(10)的最大值
    2. 查看这个最大值是否超过了数组的长度
    3. 超过则扩容,newCapacity = oldCapacity + (oldCapacity >> 1)
    4. 判断newCapacity 是否超过数组长度最大
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值