`
yuyajian
  • 浏览: 15632 次
社区版块
存档分类
最新评论

List源码分析

    博客分类:
  • java
 
阅读更多

 

java.util

 

接口 List<E>

 

所有超级接口:

 

Collection<E>, Iterable<E>

 

所有已知实现类:

 

AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector

 

List接口在java.util包里,继承Collection<E>超级接口

 

主要分析一下:ArrayListLinkedListVector

 

 

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 实现所使用的标记接口,用来表明其支持快速(通常是固定时间)随机访问。

 

2LinkedList

 

链表的数据结构:

 

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,支持在队列两端插入和移除元素。

 

3Vector

 

Add():添加方法

 

 

 

容量不够时按照当前数组长度的2倍进行扩容。

 

Remove():删除方法

 

ArrayList

 

Get():查询方法

 

ArrayList

 

使用建议:

 

  • 线程安全,方法均加了synchronized关键字

 

注意,因为vector提供set方法修改值,导致在iterator时会造成不安全。

 

  • 指定向量大小

 

在知道向量大小情况下,建议在创建时指定向量大小,方法为ensureCapacity(int minCapacity)         

 

  • 遍历方式

 

vector继承AbstractList接口,实现RandomAccess接口,使用for循环遍历,效率高于Iterator

 

 

 

 

 

 

 

  • 大小: 40.4 KB
  • 大小: 19.5 KB
  • 大小: 13.1 KB
  • 大小: 18.6 KB
  • 大小: 14.8 KB
  • 大小: 20.6 KB
  • 大小: 13.1 KB
分享到:
评论

相关推荐

    list源码分析,基于c++ 和vs2019,cpp20标准

    list源码分析,基于c++ 和vs2019,cpp20标准

    c++ ,vs2019, cpp20规范之 forward-list 源码分析

    c++ ,vs2019, cpp20规范之 forward-list 源码分析

    std::List类的遍历获得元素的操作二法

    在C++标准库中,`std::list`是一种双链表容器,它提供了一种高效的方式来存储和操作序列数据。由于`std::list`不是随机访问容器,因此它不...分析这些文件可以帮助我们理解`std::list`的实际使用场景和代码实现细节。

    list链表c++源代码

    在C++编程中,`list`是一种非常重要的数据结构,它是一个双向链接列表,提供了高效的操作,如插入、删除等。...通过分析和调试`list.cpp`代码,你可以进一步掌握链表的内部工作原理,这将对提升你的编程技能大有裨益。

    lucene3源码分析

    ### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...

    ZLMediaKit源码分析

    《ZLMediaKit源码分析》 ZLMediaKit是一个开源的媒体服务器框架,它主要用于音视频流的推送和播放,支持RTMP、HLS、HTTP-FLV等多种协议。本文将深入分析其架构和主要模块,以帮助读者理解其工作原理。 1. 引言 ...

    Java容器学习笔记:容器概览,容器中的设计模式,容器源码分析 - List,容器源码分析 - Map,容器源码分析 - 并发容

    容器源码分析 - List, 容器源码分析 - Map, 容器源码分析 - 并发容 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、可...

    标准库list源码

    源码分析: - `list`的实现通常基于模板类,这意味着它可以存储任何类型的数据,只要该类型支持赋值操作。 - `list`的主要操作包括插入、删除、迭代器操作、大小调整等。这些操作在源码中会对应不同的成员函数,例如...

    C++简单源码分析

    在这个“C++简单源码分析”中,我们将探讨C++的基本语法、常用算法以及程序设计技巧。 首先,C++的基础语法是学习的起点。C++的语法结构严谨,包括变量声明、类型系统、控制流(如if语句、for循环和while循环)、...

    Linux1.0内核源码分析

    ### Linux 1.0 内核源码分析之链表实现与应用 #### 一、引言 在深入探讨Linux内核源码之前,我们首先需要了解Linux内核的一些基本概念以及链表在其中的应用场景。Linux内核是Linux操作系统的核心部分,负责管理...

    CTorrent程序源码分析.pdf

    CTorrent程序源码分析所涉及的知识点涵盖了BitTorrent协议的实现、P2P网络的架构设计、C++编程技巧、以及网络编程中的一些细节处理。CTorrent作为BitTorrent协议的一个C++实现版本,其源码分析为我们理解BitTorrent...

    goahead源码分析

    GoAhead是一款轻量级的嵌入式Web服务器,它的源码分析主要涉及以下几个核心概念和流程: 1. **主函数main()**: - `main()`是程序的入口点,负责初始化整个Web服务器。 - 它调用`websOpenServer()`来启动Web...

    C# DataTable 源码分析

    源码分析的重点在于理解`DataTable`的内部工作原理,如数据的增删改查、索引机制、事件处理等。通过阅读和理解`DataTable.cs`,开发者可以掌握如何高效地操作数据,如何设置和验证数据约束,以及如何与其他.NET组件...

    鸿蒙内核源码分析(百篇博客分析).pdf

    《鸿蒙内核源码分析》是一份深入研究华为鸿蒙操作系统的内核源码的文档,通过百篇博客的分析,旨在帮助读者理解鸿蒙内核的核心机制和工作原理。文档涵盖了从基础数据结构、进程管理、时钟任务、任务调度到内存管理等...

    LVS源码分析1

    LVS源码分析 LVS(Linux Virtual Server)是一种开源的负载均衡软件,能够将incoming请求分配到多个real server上以提高系统的可扩展性和可靠性。下面是LVS源码分析的总结。 ip_vs_conn 结构体 ip_vs_conn结构体...

    android开源框架源码分析

    "Android 开源框架源码分析" Android 是一个开源的操作系统,而其框架源码的分析则是其中一个非常重要的方面。今天,我们将对 Android 开源框架源码进行分析,涉及的内容包括 EventBus、Glide、OkHttp、Android ...

    ECSHOP源码分析(权限系统)

    这张表记录了管理员的基本信息,与权限相关的字段是action_list,它存储了管理员所拥有的所有权限代码。这些权限代码是用逗号分隔的字符串,对应ecs_admin_action表中的action_code字段值。 ### 权限验证与会话管理...

    仿qq list源码

    5. **QQLstCode 源码分析** - **目录结构**:查看源码中的目录结构,了解模块划分和文件组织。 - **核心类**:识别出负责数据绑定、视图渲染和交互处理的主要类。 - **代码逻辑**:分析数据加载、视图创建和更新...

Global site tag (gtag.js) - Google Analytics