Demo02.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package course.collection;
  2. import java.util.ArrayList;
  3. /**
  4. * @author WanJl
  5. * @version 1.0
  6. * @title Demo02
  7. * @description
  8. * @create 2026/7/29
  9. */
  10. public class Demo02 {
  11. /*
  12. 我们一般把集合 称为集合框架,因为集合是把一些底层数据结构进行了封装。
  13. 比如单列集合中的List
  14. List直译就是列表,也就是对应数据结构中的 线性表结构
  15. 线性表结构大致可以分为四种:
  16. 栈结构:
  17. 先进后出,加入元素,称为 入栈、压栈。 移除元素,称为出栈、弹栈。
  18. 队列结构:
  19. 先进先出
  20. 数组结构:
  21. 是连续的数据存储,查询的时候可以通过索引快速定位,
  22. 增删的时候,需要修改前后进行移动。所以增删慢,查询快。
  23. 链表结构:
  24. 是不连续的存储,不需要在内存中开辟连续的存储空间,
  25. 只需要从头结点开始,每个节点都有一个执行下一个节点的指针(地址)。
  26. 随机查询的时候,需要从第1个结点开始依次向后查找,查询速度慢。
  27. 增删的时候,只需要改变临近结点的指针,就可以。所以增删速度快。
  28. List的实现类对应的数据结构:
  29. ArrayList:数组
  30. LinkedList:队列、栈、链表
  31. ArrayList:
  32. 本质是一个长度可变的数组,底层使用的是数组。
  33. ArrayList 里面可以存储 null
  34. 和Vector差不多,但是不是线程同步的。性能更高一些。
  35. ArrayList有一个参数 Capacity,容量会随着元素的增加而增加,并且会进行扩容。
  36. ArrayList的默认初始容量为10
  37. private static final int DEFAULT_CAPACITY = 10;
  38. 内部还有一个空的Object类型的数组
  39. private static final Object[] EMPTY_ELEMENTDATA = {};
  40. 还有一个默认容量的空数组
  41. private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  42. ArrayList中维护的底层数组就是elementData。
  43. 空数组没有任何元素插入的时候,就使用的数组容量是DEFAULTCAPACITY_EMPTY_ELEMENTDATA
  44. 但是,如果插入了一个元素,立马把elementData的容量扩容到DEFAULT_CAPACITY(也就是10)
  45. transient Object[] elementData;
  46. elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  47. 只要增加了一个元素,就变成了:
  48. elementData=new Object[DEFAULT_CAPACITY]
  49. ArrayList有一个属性,是元素的个数,不是数组长度。
  50. 而是数组中存储有效元素的个数。
  51. private int size;
  52. ArrayList中有一个返回元素个数的方法:size(),返回的就是size属性。
  53. 判断是否为空isEmpty()返回的就是size是否等于0
  54. ArrayList有三个构造方法:
  55. ArrayList(int initialCapacity) 创建一个ArrayList集合对象,指定初始容量为initialCapacity
  56. ArrayList() 创建一个ArrayList集合对象,指定初始容量为0:
  57. elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  58. 把维护的elementData数组,设置为空数组。
  59. ArrayList(Collection<? extends E> c) 创建一个ArrayList集合对象,传入的是Collection接口的实现类对象。
  60. 其实就是把另一个集合对象的元素加入到新建的ArrayList结合对象中
  61. trimToSize():缩减容量为集合有效元素个数
  62. elementData = (size == 0)? EMPTY_ELEMENTDATA: Arrays.copyOf(elementData, size);
  63. elementData =EMPTY_ELEMENTDATA
  64. elementData =Arrays.copyOf(elementData, size);
  65. ensureCapacity(int minCapacity) 确保容量-自动扩容的前提
  66. 每当向数组elementData添加元素的时候,都要去先检查一遍添加后的元素个数是否会超过当前的数组的长度。
  67. 如果超过,就要扩容。数组扩容是通过ensureCapacity()来实现的,确保容量足够。
  68. 在实际添加大量元素之前,我们可以使用ensureCapacity()来手动增加ArrayList的容量。
  69. 这个方法是使用public修饰的,就是我们如果想要添加大量元素,就可以调用这个方法,手动扩容。
  70. 直接扩容到期望最小容量minCapacity
  71. 只有满足下面两个条件,才会进行扩容
  72. minCapacity > elementData.length 期望的最小容量要大于当前维护的数组长度
  73. !(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA && minCapacity <= DEFAULT_CAPACITY)
  74. elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 如果是空数组
  75. minCapacity <= DEFAULT_CAPACITY 期望的最小容量,如果小于等于默认容量
  76. 两个条件同时满足后取反。也就是,elementData既不能是空数组,也不能是期望的最小容量小于等于默认容量。才会进行扩容
  77. Object[] grow(int minCapacity) 扩容
  78. oldCapacity 旧的容量
  79. minCapacity - oldCapacity 最小要增加的容量
  80. oldCapacity >> 1 最好增加的容量 就是 旧的容量除以2
  81. ArraysSupport.newLength(oldCapacity,minCapacity - oldCapacity, oldCapacity >> 1 );
  82. 比如 旧容量 10
  83. 最小 10
  84. 最好增加的容量 10/2 5
  85. 10+5 =15 刚好是原来的1.5倍
  86. ArrayList每次扩容的时候,都是原来容量的1.5倍。
  87. ArrayList常用的方法:
  88. 创建集合对象: ArrayList list=new ArrayList<>();
  89. list.add(对象); //添加元素到集合
  90. list.add(索引值,对象);//添加元素到集合的指定位置
  91. list.isEmpty(); //判断集合是否为空
  92. list.size();//获取集合长度
  93. list.toArray();//把集合转换为数组
  94. list.get(索引值); //获取指定索引位置的元素
  95. list.getFirst();//获取集合第一个元素
  96. list.getLast();//获取集合最后一个元素
  97. list.indexOf(对象);查询集合中这个元素首次出现的索引值,没有就返回-1
  98. list.remove(对象);// 移除集合中指定的元素
  99. list.clear(); 清空集合
  100. */
  101. public static void main(String[] args) {
  102. ArrayList list01=new ArrayList<>(); //创建一个默认容量为10集合
  103. ArrayList list02=new ArrayList<>(20);//创建一个初始容量为20集合
  104. ArrayList list03=new ArrayList<>(list02);//创建一个集合,以另一个集合为参数,加入到当前集合。
  105. System.out.println(list01.size());
  106. System.out.println(list02.size());
  107. System.out.println(list03.size());
  108. System.out.println(20<<1);
  109. System.out.println(20>>1);
  110. }
  111. }