Java容器类源码分析前言之集合框架结构(基于JDK8)
一、基本概念
Java容器类库的用途是“保存对象”,容器库类分为两个不同的分支。
1.Collection。可以保存一个或多个对象,将其保存为一个序列。Collection又可以细分为List(表),Set(集)和Queue(队列)。List按照插入顺序保存对象,从索引0开始为每一个插入的对象分配一个索引。Set与List类似,但与List不同的是Set中不能有相同的对象。Queue对象产生的顺序通常与元素的插入顺序相同,一般按照先进先出的规则来删除与访问元素。
2.Map。Map(映射表)使用二维数组来保存一组或多组成对的“Key—Value”(键值对)对象,一个Key对应一个Value,你可以用key来查找它所对应的value。与Collection不同的是,Collection使用索引数来来查找索引数对应的对象,而Map使用键对象来查找值对象,其实现了键对象与值对象的映射关系。
二、集合类的框架结构

图 1 集合框架中类的继承关系 (部分)
集合框架中类自上而下的的主要继承关系如上图,分别为实现了Collection接口的AbstractCollect类和实现了Map接口的AbstractMap类两大分支。其中较为常用的类有实现了List接口的ArrayList与linkedList类,实现了Set接口的HashSet、TreeSet、LinkedHashSet类,实现了Queue接口的PrioretyQueue类,实现了Map接口的HashMap、LinkedHashMap、TreeMap类等。
(注:这里没有给出类的具体接口实现关系,有关类的具体接口实现关系在后面源码分析的博文中补充)
- ArrayList。ArrayList是一个可以动态增长和缩减的索引序列,其中的元素是未排序的,可以有重复元素。查找元素(指get(int index)方法)的的时间复杂度为O(1),插入和删除元素的时间复杂度为O(n)。查找元素比LinkedList高效,但是插入和删除元素与LinkedList相比较慢。
- LinkedList。LinkedList是一个可以在任何位置快速高效的地插入和删除元素的双向链表,其中的的元素未排序,可以有重复元素。查找元素的时间复杂度为O(n),插入和删除元素的时间复杂度为O(1)。与ArrayList比,查找元素较慢,插入和删除元素较为高效。LinkedList还可以用来实现栈,队列,以及双端队列。
- HashMap。HashMap是一种储存键值对的数据结构,其中的元素未排序,键对象不能重复,值对象可以重复。HashMap其底层数据结构为散列表(数组+链表),若散列函数均匀散列,装填因子合理,查找元素的时间复杂度为O(1),插入和删除的时间复杂度也均为O(1)。若散列表中的某个桶储存的链表长度大于8时,该链表将转化为红黑树,这个桶中元素的查询、插入和删除的时间复杂度将都变为O(log n),n为该桶中的元素个数。
- LinkedHashMap。也是一种储存键值对的映射表,与HashMap不同的是,LinkedHashMap还使用了双向链表来储存元素的插入顺序。
- TreeMap。TreeMap是一种对插入的键值对自动有序排列的映射表。其中的键对象已排序,键对象不能重复,值对象可以重复,插入TreeMap的键对象要实现Comparable或Comparator接口具有排序功能。底层数据结构为红黑树,查询、插入和删除的时间复杂度为O(log n),效率均低于HashMap()。
- HashSet。HashSet是一个不能插入重复元素的集合。其中的元素未排序,没有重复元素。通过阅读源码可知,HashSet是通过HashMap实现的,其查找、插入和删除的时间复杂度也均为O(1)。
- LinkedHashSet。其中的元素未排序,没有重复元素。LinkedHashSet与HashSet不同的是,LinkedHashSet是通过LinkedHashMap实现,所以LinkedHashSet也储存了元素的插入顺序。
- TreeSet。TreeSet是一个没有重复元素的能够对插入元素自动排序的集合。其中的元素已排序,没有重复元素。通过源码可知,HashSet是通过TreeMap实现,所以插入TreeSet的对象要实现Comparable或Comparator接口具有排序功能。底层数据结构为红黑树,查询、插入和删除的时间复杂度为O(log n),效率均低于HashSet()。
- PriorityQueue。PriorityQueue是一种可以高效查询其中最小的元素的集合,底层数据结构为最小堆,没有重复元素。查询最小元素的时间复杂度为O(1),查询其他元素的时间复杂度为O(n),插入和删除的时间复杂度为O(log n)。
(注:以上集合类均不是线程安全的 )
(小官原创,若有谬误,望各位前辈批评指正)
Java容器类源码分析前言之集合框架结构(基于JDK8)的更多相关文章
- Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)
一.基本概念 迭代器是一个对象,也是一种设计模式,Java有两个用来实实现迭代器的接口,分别是Iterator接口和继承自Iterator的ListIterator接口.实现迭代器接口的类的对象有遍历 ...
- JDK源码分析(三)——HashMap 下(基于JDK8)
目录 概述 内部字段及构造方法 哈希值与索引计算 存储元素 扩容 删除元素 查找元素 总结 概述 在上文我们基于JDK7分析了HashMap的实现源码,介绍了HashMap的加载因子loadFac ...
- Java Reference 源码分析
@(Java)[Reference] Java Reference 源码分析 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...
- Java集合类源码分析
常用类及源码分析 集合类 原理分析 Collection List Vector 扩充容量的方法 ensureCapacityHelper很多方法都加入了synchronized同步语句,来保 ...
- Java Collections 源码分析
Java Collections API源码分析 侯捷老师剖析了不少Framework,如MFC,STL等.侯老师有句名言: 源码面前,了无秘密 这句话还在知乎引起广泛讨论. 我对教授程序设计的一点想 ...
- Java 容器源码分析之1.7HashMap
以下内容基于jdk1.7.0_79源码: 什么是HashMap 基于哈希表的一个Map接口实现,存储的对象是一个键值对对象(Entry<K,V>): HashMap补充说明 基于数组和链表 ...
- Java - ArrayList源码分析
java提高篇(二一)-----ArrayList 一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 nul ...
- Netty源码分析(前言, 概述及目录)
Netty源码分析(完整版) 前言 前段时间公司准备改造redis的客户端, 原生的客户端是阻塞式链接, 并且链接池初始化的链接数并不高, 高并发场景会有获取不到连接的尴尬, 所以考虑了用netty长 ...
- [Java]Vector源码分析
第1部分 Vector介绍 Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长.继承于AbstractList,实现了List, RandomAccess, Clone ...
随机推荐
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十六之铭文升级版
铭文一级: linux crontab 网站:http://tool.lu/crontab 每一分钟执行一次的crontab表达式: */1 * * * * crontab -e */1 * * * ...
- [solution] JZOJ 5459. 密室
[solution] JZOJ 5459. 密室 Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有$N$ 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的 ...
- subarray sum
public class Solution { /* * @param nums: A list of integers * @return: A list of integers includes ...
- 响应式网站设计(Responsive Web design)
页面的设计与开发应当根据用户行为以及设备环境(系统平台.屏幕尺寸.屏幕定向等)进行相应的响应和调整.具体的实践方式由多方面组成,包括弹性网格和布局.图片.CSS media query的使用等.无论用 ...
- asp.net对接拼多多
asp.net对接拼多多视频地址:https://www.bilibili.com/video/av43512047/?p=7
- [Swift]扩展UIColor:实现十六进制颜色字符串与UIColor之间的相互转换
对[UIColor]进行扩展 import UIKit extension UIColor { // Hex String -> UIColor convenience init(hexStri ...
- ubuntu18.04 出现 Command 'ifconfig' not found 问题的解决办法
我们在虚拟主机中查看ip地址需要输入ifconfig,但是报以下错误: 系统提示我们安装 net-tools,当我们输入以下命令,即可安装完成. sudo apt-get install net-to ...
- numpy中pad函数的常用方法
一.参数解释 ndarray = numpy.pad(array, pad_width, mode, **kwargs) array为要填补的数组 pad_width是在各维度的各个方向上想要填补的长 ...
- 在向一个ArrayList中添加大量元素前,可以使用ensureCapacity方法来增加ArrayList的容量
参考http://www.jianshu.com/p/f174d49b391c ensureCapacity(),该方法就是 ArrayList 的扩容方法.在前面就提过 ArrayList 每次新增 ...
- Java工程师学习指南 完结篇
Java工程师学习指南 完结篇 先声明一点,文章里面不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦. 因为笔者还只是一名在校 ...