List

1、 list集合和数组的比较

  • 数组:是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)
  • 集合:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变。(底层还是数组)
  • 集合和数组的区别:
    • 共同点∶都是存储数据的容器
    • 不同点︰数组的容量是固定的,集合的容量是可变的

2、 为什么使用集合而不是数组

  • 集合和数组相似点:
    • 都可以存储多个对象,对外作为一个整体存在
  • 数组的缺点
    • 长度必须在初始化时指定,且固定不变
    • 数组采用连续存储空间,删除和添加效率低下、数组无法直接保存映射关系
    • 数组缺乏封装,操作繁琐 解决:集合框架应用而生:存储不确定数量的数据(可以动态改变集合长度)

3、 List集合 List集合的主要实现类有ArrayList和LinkedList,分别是数据结构中顺序表和链表的实现。另外还包括栈和队列的实现类:Deque和Queue。特点:有序 不唯一(可重复)

  • ArrayList(数组)
    • 在内存中分配连续的空间,实现了长度可变的数组
    • 优点:遍历元素和随机访问元素的效率比较高
    • 缺点︰添加和删除需大量移动元素效率低,按照内容查询效率低
  • LinkedList(双向链表)
    • 缺点∶遍历和随机访问元素效率低下
    • 优点:插入、删除元素效率比较高(但是前提也是必须先低效率查询才可。如果插入删除发生在头尾可以减少查询次数)

4、 List的常用方法 5、 List源码解析

  • 看继承结构
    • 看这个类的继承结构,处于一个什么位置,不需要背记,有个大概的感觉就可以
  • 看全局变量
    • 一般在全局变量中会做很多初始化事情。
  • 看构造方法
    • 一般在构造方法中会做很多事情,要跟踪方法中的方法。
  • 看常用方法
    • 没必要所有方法都去了解,知道常用、核心的方法实现即可。

6、 ArrayList和LinkedList和Vector的区别 1615986683670

7、List源码解析

1、ArrayList默认容量是10,底层是数组;elementData:实际存储元素的地方

2、elementData:指向DEFAULTCAPACITY_EMPTY_ELEMENTDATA:说明调的是无参构造器,默认容量是10(第一次添加元素时初始化容量为10)

3、方法:calculateCapacity(Object[] elementData, int minCapacity):确定需要多少容量

4、方法ensureExplicitCapacity(int minCapacity)判断是否需要扩容

5、方法grow(minCapacity)扩容1.5倍:生成一个新数组,赋值给elementData 解决数组长度不可变的问题

6、缩容:删除元素:先找到这个元素,再将此元素后所有的元素往前移动一位

7、modCount++:多线程的情况下:A线程在遍历数据,B线程在继续存放数据(只有新增或删除元素的时候modCount才会++):保证数据一致性(保证在遍历的时候数据不会发生变化)

end
  • 作者:Kunrt(联系作者)
  • 发表时间:2024-10-18 11:53
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论

    hh
    6666