参考:https://blog.csdn.net/weixin_42468526/article/details/81178698
https://www.cnblogs.com/softidea/p/6410680.html
https://www.cnblogs.com/wangwudi/p/11912632.html
ArrayList
ArrayList 是实现了动态数组,动态的含义就是大小可变
特性:
1、支持随机访问,查询效率高
2、增加删除需要移动元素,效率低
3、自动扩容的特点
4、支持 元素 null
5、内部没有实现同步机制,线程不安全的
1、如何增加元素
1、判断增加的位置是否合法
2、size + 1, 然后判断是否需要扩容
3、将后面元素向后移动,将增加的元素赋值给指定位置
1、如何删除元素
1、删除指定索引的元素
1、判断删除的位置是否合法
2、将元素前移动,size - 1
1、删除指定元素
1、查找该元素
如果查找失败,则返回 null
如果查找成功,则进行下步
2、按照删除指定索引的方法进行删除
3、如何扩容
-
默认每次会扩容 1.5 倍,可以手动调用 ensureCapacity(需要容量) 方法来实现扩容
-
先判断当前数组长度 和 需要容量 大小比较,如果不需要扩容,则返回。
-
如果需要扩容,新容量 = 当前数组长度的 1.5 倍。
3.1 新容量 < 需要容量,说明 新容量不够,取较大者
. 3.11如果是需要容量 < 默认初始容量,则直接取较大者 默认初始容量
. 3.12如果是需要容量 > 默认初始容量,则直接取较大者 需要容量
3.2 新容量 > 需要容量
. 3.21 新容量 < 最大容量,则取较小者 新容量
. 3.22 新容量 > 最大容量
. . 3.221 需要容量 > 最大容量 取 Integer Max -8
. . 3.222 需要容量 < 最大容量 取 最大容量
集合的迭代器访问:
一般在遍历集合时候,如果需要操作 remove(),修改集合的长度,这时就需要使用 iterator 来遍历
参考: https://www.cnblogs.com/msymm/p/9872912.html
LinkedList
LinkedList 是一个继承了AbstractSequentialList 的双向链表
一般也用来当作堆栈、队列、双端队列来操作。
特点:
1、插入删除效率高,链式结构
2、没有实现同步机制,线程不安全的
两者如何选择:
多数情况下,当你遇到访问元素比插入或者是删除元素更加频繁的时候,你应该使用ArrayList。
另外一方面,当你在某个特别的索引中,插入或者是删除元素更加频繁,或者你压根就不需要访问元素的时候,你会选择LinkedList。
这里的主要原因是,在ArrayList中访问元素的最糟糕的时间复杂度是”1″,而在LinkedList中可能就是”n”了。在ArrayList中增加或者删除某个元素,通常会调用