java.util
接口 List<E>
所有超级接口:
Collection<E>, Iterable<E>
所有已知实现类:
AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector
List接口在java.util包里,继承Collection<E>超级接口
主要分析一下:ArrayList、LinkedList、Vector
|
ArrayList |
LinkedList |
Vector |
数据结构 |
Object[] size |
Node<E> first Node<E> last size |
Object[] size |
初始值 |
10 |
0 |
10 |
是否有序 |
有序可重复 |
有序可重复 |
有序可重复 |
安全性 |
不安全 |
不安全 |
线程安全 |
扩容方案 |
每次ADD扩容0.5倍 可指定长度 |
自增长 |
容量不够时2倍扩容 可指定长度 |
性能分析 |
查找快,增删慢 |
查找慢,增删快 |
查找快,增删慢 |
是否可变 |
不可变 |
不可变 |
可变 |
1,ArrayList
Add():添加方法
对于每次ADD都扩容,官方文档解释如下:
The add operation runs in amortized constant time, that is, adding n elements requires O(n) time. All of the other operations run in linear time (roughly speaking). The constant factor is low compared to that for the LinkedList implementation.
意为:分担时间开销
Remove():删除方法
Get():查找方法
直接通过数组下标读取。
由上述代码分析可见:
ArrayList频繁的数组拷贝操作性能低下。add/remove慢,查找快。
使用建议:
- 创建线程安全的List方式如下:
List list = Collections.synchronizedList(new ArrayList(...));
- 指定list大小
在知道List大小情况下,建议在创建时指定list大小,方法为ensureCapacity(int minCapacity)
- 遍历方式
ArrayList继承AbstractList接口,实现RandomAccess接口,使用for循环遍历,效率高于Iterator
AbstractList接口是对“随机访问”数据存储(如数组)支持
RandomAccess接口是List 实现所使用的标记接口,用来表明其支持快速(通常是固定时间)随机访问。
2,LinkedList
链表的数据结构:
Node(prev) |
item |
Node(next) |
Add():添加方法
Remove():删除方法
Get():查找方法
使用二分法遍历查找。
由上述代码分析可见:
LinkedList使用链表数据结构。add/remove较快,查找慢。
- 创建线程安全的List方式如下:
List list = Collections.synchronizedList(new LinkedList(...));
- 遍历方式
LinkedList继承AbstractSequentialList接口,实现Deque接口,使用Iterator循环遍历,效率高于for
AbstractSequentialList接口是对“连续访问”数据存储(如链接列表)支持的
Deque接口是双端队列,一个线性 collection,支持在队列两端插入和移除元素。
3,Vector
Add():添加方法
容量不够时按照当前数组长度的2倍进行扩容。
Remove():删除方法
同ArrayList
Get():查询方法
同ArrayList
使用建议:
- 线程安全,方法均加了synchronized关键字
注意,因为vector提供set方法修改值,导致在iterator时会造成不安全。
- 指定向量大小
在知道向量大小情况下,建议在创建时指定向量大小,方法为ensureCapacity(int minCapacity)
- 遍历方式
vector继承AbstractList接口,实现RandomAccess接口,使用for循环遍历,效率高于Iterator
相关推荐
list源码分析,基于c++ 和vs2019,cpp20标准
c++ ,vs2019, cpp20规范之 forward-list 源码分析
在C++标准库中,`std::list`是一种双链表容器,它提供了一种高效的方式来存储和操作序列数据。由于`std::list`不是随机访问容器,因此它不...分析这些文件可以帮助我们理解`std::list`的实际使用场景和代码实现细节。
在C++编程中,`list`是一种非常重要的数据结构,它是一个双向链接列表,提供了高效的操作,如插入、删除等。...通过分析和调试`list.cpp`代码,你可以进一步掌握链表的内部工作原理,这将对提升你的编程技能大有裨益。
### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...
《ZLMediaKit源码分析》 ZLMediaKit是一个开源的媒体服务器框架,它主要用于音视频流的推送和播放,支持RTMP、HLS、HTTP-FLV等多种协议。本文将深入分析其架构和主要模块,以帮助读者理解其工作原理。 1. 引言 ...
容器源码分析 - List, 容器源码分析 - Map, 容器源码分析 - 并发容 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、可...
源码分析: - `list`的实现通常基于模板类,这意味着它可以存储任何类型的数据,只要该类型支持赋值操作。 - `list`的主要操作包括插入、删除、迭代器操作、大小调整等。这些操作在源码中会对应不同的成员函数,例如...
在这个“C++简单源码分析”中,我们将探讨C++的基本语法、常用算法以及程序设计技巧。 首先,C++的基础语法是学习的起点。C++的语法结构严谨,包括变量声明、类型系统、控制流(如if语句、for循环和while循环)、...
### Linux 1.0 内核源码分析之链表实现与应用 #### 一、引言 在深入探讨Linux内核源码之前,我们首先需要了解Linux内核的一些基本概念以及链表在其中的应用场景。Linux内核是Linux操作系统的核心部分,负责管理...
CTorrent程序源码分析所涉及的知识点涵盖了BitTorrent协议的实现、P2P网络的架构设计、C++编程技巧、以及网络编程中的一些细节处理。CTorrent作为BitTorrent协议的一个C++实现版本,其源码分析为我们理解BitTorrent...
GoAhead是一款轻量级的嵌入式Web服务器,它的源码分析主要涉及以下几个核心概念和流程: 1. **主函数main()**: - `main()`是程序的入口点,负责初始化整个Web服务器。 - 它调用`websOpenServer()`来启动Web...
源码分析的重点在于理解`DataTable`的内部工作原理,如数据的增删改查、索引机制、事件处理等。通过阅读和理解`DataTable.cs`,开发者可以掌握如何高效地操作数据,如何设置和验证数据约束,以及如何与其他.NET组件...
《鸿蒙内核源码分析》是一份深入研究华为鸿蒙操作系统的内核源码的文档,通过百篇博客的分析,旨在帮助读者理解鸿蒙内核的核心机制和工作原理。文档涵盖了从基础数据结构、进程管理、时钟任务、任务调度到内存管理等...
LVS源码分析 LVS(Linux Virtual Server)是一种开源的负载均衡软件,能够将incoming请求分配到多个real server上以提高系统的可扩展性和可靠性。下面是LVS源码分析的总结。 ip_vs_conn 结构体 ip_vs_conn结构体...
"Android 开源框架源码分析" Android 是一个开源的操作系统,而其框架源码的分析则是其中一个非常重要的方面。今天,我们将对 Android 开源框架源码进行分析,涉及的内容包括 EventBus、Glide、OkHttp、Android ...
这张表记录了管理员的基本信息,与权限相关的字段是action_list,它存储了管理员所拥有的所有权限代码。这些权限代码是用逗号分隔的字符串,对应ecs_admin_action表中的action_code字段值。 ### 权限验证与会话管理...
5. **QQLstCode 源码分析** - **目录结构**:查看源码中的目录结构,了解模块划分和文件组织。 - **核心类**:识别出负责数据绑定、视图渲染和交互处理的主要类。 - **代码逻辑**:分析数据加载、视图创建和更新...