博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java List集合总结
阅读量:5983 次
发布时间:2019-06-20

本文共 1228 字,大约阅读时间需要 4 分钟。

List集合

List集合代表一个有序、可重复的集合.本质是顺序表,提供增删改查数据的基本功能,且可以通过索引来插入替换和删除集合元素的方法。

ArrayList

ArrayList是基于数组实现的List类,其封装了一个动态的允许再分配的Object数组,这个数组默认大小是10.当向这个数组添加元素超过了这个数组的大小时,这个数组的长度会自动增加。线程不安全的。

ensureCapacity(int minCapacity),可以一次性增加一定数量的大小,减少分配次数,从而提高性能,用于确定要保存的数据的数量。 trimToSize()将Object[]数组的数组长度调整为当前元素的的个数,减少ArrayList对象占用的内存空间。 插入,删除,修改,查找,获取操作如下:

  1. 插入操作需要先检查是否需要扩容数组,如果数据是插入到尾部的则可直接赋值,否则插入到中部则需要调用System.arraycopy()方法(JNI方法)移动数据腾出空间,再插入数据。
  2. 删除操作直接通过System.arraycopy()操作覆盖目标值的位置
  3. 修改元素值只需要在数组中直接替换。
  4. 查找操作是简单的遍历查找,因此效率可能不高 。但是比LinkedList的遍历速度快。
  5. 获取元素操作通过index直接返回,比较高效。

Vector

用法上几乎和ArrayList完全相同,但Vector是线程安全的,因此性能比ArrayList低。

Stack

Vector的子类,表示后进先出(LIFO)对象堆栈。

peek():返回栈的第一个元素,不将该元素移出栈(即取出栈顶元素,也是返回数组末尾的元素); pop():返回栈的第一个元素,并将该元素移出栈(即,取出栈顶元素,并将该元素从栈中删除,也是取出数组末尾的元素,然后将该元素从数组中删除); push():将一个元素放入栈中,这个栈位于栈顶(通过将元素追加到数组的末尾中)。

LinkedList

底层数据结构是链表,查询慢,增删快,线程不安全,效率高。

1.实现了List接口,能对它进行队列操作。

2.实现了Deque接口,即能将LinkedList当作双端队列使用;
3.由于是基于列表的,LinkedList的没有扩容方法!默认加入元素是尾部自动扩容!

应用场景

ArrayList读取速度快于LinkedList,而插入和删除速度又慢于LinkedList。

1.ArrayList随机读取的时候采用的是get(index),根据指定位置读取元素,而LinkedList则采用size/2 ,二分法去加速一次读取元素!

2.ArrayList插入时候要判断容量,删除时候要将数组移位,有一个复制操作!而LinkedList直接插入,不用判断容量,删除的时候也是直接删除跳转指针节点,没有复制的操作!

转载于:https://juejin.im/post/5bd951e86fb9a0223261c379

你可能感兴趣的文章
CentOS 6.x 快速安装L2TP ***
查看>>
一篇文章能够看懂基础源代码之JAVA篇
查看>>
Goldengate双向复制配置
查看>>
Oracle官方内部MAA教程
查看>>
DNS相关配置
查看>>
miniWindbg 功能
查看>>
《Cisco IPv6网络实现技术(修订版)》一2.6 配置练习:使用Cisco路由器配置一个IPv6网络...
查看>>
《可穿戴创意设计:技术与时尚的融合》一一第2章 与可穿戴设备有关的故事...
查看>>
ruby动态new对象
查看>>
Linux中grep命令的12个实践例子
查看>>
使用Docker Compose部署基于Sentinel的高可用Redis集群
查看>>
Mybatis 3学习笔记(一)
查看>>
Guice系列之用户指南(十)
查看>>
树与森林的存储、遍历和树与森林的转换
查看>>
Android自定义属性
查看>>
Visual C#之核心语言
查看>>
代码重构(五):继承关系重构规则
查看>>
Windows App开发之集合控件与数据绑定
查看>>
中大型网站技术架构演变过程
查看>>
ARTS训练第三周
查看>>