AbstractList 和 AbstractSequentialList
AbstractList 抽象类实现了 List 接口,其内部实现了所有的 List 都需具备的功能,子类可以专注于实现自己具体的操作逻辑 。
// 查找元素 o 第一次出现的索引位置public intindexOf(Object o)// 查找元素 o 最后一次出现的索引位置public intlastIndexOf(Object o)//···
AbstractSequentialList 抽象类继承了 AbstractList,在原基础上限制了访问
元素的顺序只能够按照顺序访问,而不支持随机访问,如果需要满足随机访问的
特性,则继承 AbstractList 。子类 LinkedList 使用链表实现,所以仅能支持顺
序访问,继承了 AbstractSequentialList而不是 AbstractList 。
Vector
文章插图
vector 在现在已经是一种过时的集合了,包括继承它的 Stack 集合也如此,它们被淘汰的原因都是因为性能低下 。
JDK 1.0 时代,ArrayList 还没诞生,大家都是使用 Vector 集合,但由于 Vector 的每个操作都被 synchronized 关键字修饰,即使在线程安全的情况下,仍然进行无意义的加锁与释放锁,造成额外的性能开销,做了无用功 。
public synchronized boolean add(E e);public synchronized E get(int index);
在 JDK 1.2 时,Collection 家族出现了,它提供了大量高性能、适用於不同场合的集合,而 Vector 也是其中一员,但由于 Vector 在每个方法上都加了锁,由于
需要兼容许多老的项目,很难在此基础上优化Vector了,所以渐渐地也就被历史
淘汰了 。
现在,在线程安全的情况下,不需要选用 Vector 集合,取而代之的是 ArrayList 集合;在并发环境下,出现了 CopyOnWriteArrayList,Vector 完全被弃用了 。
Stack
文章插图
Stack是一种后入先出(LIFO)型的集合容器,如图中所示,大雄是最后一个进入容器的,top指针指向大雄,那么弹出元素时,大雄也是第一个被弹出去的 。
Stack 继承了 Vector 类,提供了栈顶的压入元素操作(push)和弹出元素操作(pop),以及查看栈顶元素的方法(peek)等等,但由于继承了 Vector,正所谓跟错老大没福报,Stack 也渐渐被淘汰了 。
取而代之的是后起之秀 Deque 接口,其实现有 ArrayDeque,该数据结构更加完善、可靠性更好,依靠队列也可以实现 LIFO 的栈操作,所以优先选择 ArrayDeque 实现栈 。
Deque<Integer> stack = new ArrayDeque<Integer>;
ArrayDeque 的数据结构是:数组,并提供头尾指针下标对数组元素进行操作 。本文也会讲到哦,客官请继续往看,莫着急!ArrayList
ArrayList 以数组作为存储结构,它是线程不安全的集合;具有查询快、在数组中间或头部增删慢的特点,所以它除了线程不安全这一点,其余可以替代Vector,而且线程安全的 ArrayList 可以使用 CopyOnWriteArrayList 代替 Vector 。
关于 ArrayList 有几个重要的点需要注意的:
- 具备随机访问特点,访问元素的效率较高,ArrayList 在频繁插入、删除集合元素的场景下效率较低 。
- 底层数据结构:ArrayList 底层使用数组作为存储结构,具备查找快、增删慢的特点
- 线程安全性:ArrayList 是线程不安全的集合
- ArrayList 首次扩容后的长度为 10,调用 add 时需要计算容器的最小容量 。可以看到如果数组 elementData 为空数组,会将最小容量设置为 10,之后会将数组长度完成首次扩容到 10 。
// new ArrayList 时的默认空数组private static final Object DEFAULTCAPACITY_EMPTY_ELEMENTDATA = https://www.isolves.com/it/cxkf/yy/JAVA/2020-08-10/{};// 默认容量private static final int DEFAULT_CAPACITY = 10;// 计算该容器应该满足的最小容量private static intcalculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;}
- 集合从第二次扩容开始,数组长度将扩容为原来的 1.5 倍,即:newLength = oldLength * 1.5
文章插图
LinkedListLinkedList 底层采用双向链表数据结构存储元素,由于链表的内存地址非连续,所以它不具备随机访问的特点,但由于它利用指针连接各个元素,所以插入、删除元素只需要操作指针,不需要移动元素,故具有增删快、查询慢的特点 。它也是一个非线程安全的集合 。
推荐阅读
- 已有两种太空探测器飞出我们的太阳系 飞往太阳系外的探测器
- 生科医学|全国疫情形势呈逐渐企稳态势!上海两区首日达到社会面清零目标
- 两只耳朵配不一样的助听器,助听器需要两个耳朵都配吗??
- 前端开发和后端开发的区别?这两者哪个更累?
- 如何将两个pdf合并?合并pdf的快捷方法分享
- 验孕纸两条杠是怎么回事呢
- 喝白酒时,讲究这4个“最佳”,健康饮酒醉得慢,让你多喝二两半
- 减腰两边的赘肉怎么做?
- 水陆两栖动物名字大全 水陆两栖的动物是什么动物
- 花钱学Python?不存在的!一份大纲两个网站外加搜索,足矣