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 ...
随机推荐
- UVa 11645 Bits (暴力+组合数学)
题意:给定一个数 n,求 0 ~ n,中二进制表示中连续两个 1 出现的次数. 析:枚举连续的两个 1,从低位向高位进行枚举,然后前可以是任意数,后面也是任意的,如果 n 正好是 11 还要另算,举个 ...
- Web API使用HttpResponseMessage与HttpResponseException的差异 HttpResponseMessage 返回类型
在 Web API 中提供了 HttpResponseMessage 与 HttpResponseException 用于处理返回讯息,HttpResponseMessage 用于返回一个来自于客户端 ...
- Codeforces Round #553 (Div. 2) C. Problem for Nazar 数学
题意:从奇数列 1 3 5 7 9 .... 偶数列2 4 6 8 10...分别轮流取 1 2 4 ....2^n 个数构成新数列 求新数列的区间和 (就一次询问) 思路:首先单次区间和就是一个简 ...
- asp.net对接拼多多
asp.net对接拼多多视频地址:https://www.bilibili.com/video/av43512047/?p=7
- javascript-浏览器消息提醒
如何让用户在浏览器最小化的状态下也能及时的收到消息提醒呢? 这个问题作为webRd是要正面面对的. 大约可分两种场景:一种是类似桌面通知的形式还有一种是类似QQ提醒(在系统任务栏闪烁随后高亮);接下来 ...
- 移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”
本系列文章引用了腾讯技术专家樊华恒<海量之道系列文章之弱联网优化>的部分章节,感谢原作者. 1.前言 随着移动互联网的高速发展,移动端IM以移动网络作为物理通信载体早已深入人心,这其中的成 ...
- Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍
系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...
- typescript handbook 学习笔记3
概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看 ...
- vscode 开发 Java web 急速教程
1.确认在本机已安装 JAVA SDK 2.确认在本机已安装 maven 3.确认在本机已安装 tomcat 下面是我本机相关软件版本: java version "1.8.0_191&qu ...
- 写一个shell 快速启动停止你的微服务吧
在这个微服务盛行的时代,docker获得了巨大的成功,因为我们需要在一台服务器装上N个服务. 本文不是想讨论如何使用docker,而是,在一台服务器安装了多个服务后,怎样启动方便的启动服务呢? 一.在 ...