Java集合源码分析(一)——集合框架
集合框架
集合框架如图所示

Java集合是Java提供的工具包,主要包括常用的数据结构,包括:集合、链表、队列、栈、数组、映射等。
集合的工具包位置是java.util.*
集合主要可以分为五类:
- List列表;
- Set集合;
- Map映射;
- Queue队列
- 工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)。
其中也可以主要分为Colleciton和Map两大类。
Collection
它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。
定义:
public interface Collection<E> extends Iterable<E> {}
Collection是一个接口,下面又有Queue、List、Set三个分支。其中Queue和List是有序可重复的,Set是无序不重复的。而Queue和List的本质是一样的,都是列表,不过抽象出的接口不同罢了。
再看接口下面,为了实现代码的复用,又抽象出了AbstractCollection、AbstractList、AbstractSet几个抽象类。
最底层就是具体的实现类了。
Collection还实现了Iterator接口,返回一个iterator()函数,这样可以使得Collection接口下的实现类都能被迭代器进行一个迭代遍历。
List
定义:
List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。允许有重复元素。
public interface List<E> extends Collection<E> {}
Set
定义:
Set是一个继承于Collection的接口,即Set也是集合中的一种。Set是没有重复元素的集合,无序。
public interface Set<E> extends Collection<E> {}
AbstractCollection
定义:
AbstractCollection是一个抽象类,它实现了Collection中除iterator()和size()之外的函数。这样下面的list或者set继承了之后就不需要再重复实现一些代码了。
public abstract class AbstractCollection<E> implements Collection<E> {}
AbstractList
定义:
AbstractList是一个继承于AbstractCollection,并且实现List接口的抽象类。它实现了List中除size()、get(int location)之外的函数。它还实现了iterator接口。
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {}
AbstractSet
定义:
AbstractSet是一个继承于AbstractCollection,并且实现Set接口的抽象类。由于Set接口和Collection接口中的API完全一样,Set也就没有自己单独的API。实现Set中大部分函数。
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {}
Iterator
定义:
Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口,包括:是否存在下一个元素、获取下一个元素、删除当前元素。
public interface Iterator<E> {}
ListIterator
定义:
ListIterator是一个继承于Iterator的接口,它是队列迭代器。专门用于便利List,能提供向前/向后遍历。相比于Iterator,它新增了添加、是否存在上一个元素、获取上一个元素等等API接口。
public interface ListIterator<E> extends Iterator<E> {}
Map
Map就是映射接口,实现Map接口的容器都是需要存储键值对的。基本操作就是存储、获取、删除、查找、获取容量大小等,这就有点像数据库。
定义:
public interface Map<K,V> { }
特点:
- 键不能重复,一个键只能映射一个值。
- 有些实现类能保持顺序,有些不能。
Map.Entry
interface Entry<K,V> { }
Map的内部接口,用来定义键值对,可以通过entrySet()获取键值对的集合。
AbstractMap
public abstract class AbstractMap<K,V> implements Map<K,V> {}
Map接口的主要实现抽象类,减少后面具体实现类的重复代码。
SortedMap
public interface SortedMap<K,V> extends Map<K,V> { }
用于规范有序键值对Map的接口,可以进行自然排序和实现Comparable接口的元素的排序。
NavigableMap
public interface NavigableMap<K,V> extends SortedMap<K,V> { }
继承与SortedMap的接口,它是一个可导航的键值对集合,具有了为给定搜索目标报告最接近匹配项的导航方法。
所谓可导航,就是可以获取对应范围的键值对,可以获取键集。
Dictionary
public abstract class Dictionary<K,V> {}
是JDK 1.0定义的键值对的接口,它也包括了操作键值对的基本函数。
Set
- Set 是继承于Collection的接口。它是一个不允许有重复元素的集合。
- 有两个实现类
- HashSet依赖于HashMap,它实际上是通过HashMap实现的。HashSet中的元素是无序的。
- TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。TreeSet中的元素是有序的。
AbstractSet
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {}
AbstractSet 是一个抽象类,它继承于AbstractCollection,AbstractCollection实现了Set中的绝大部分函数,为Set的实现类提供了便利。
其中实现了equals、hashCode、removeAll函数。
SortedSet
public interface SortedSet<E> extends Set<E> {}
SortedSet是继承Set的接口,多了几个有序读取的接口函数,还有比较器函数。
NavigableSet
public interface NavigableSet<E> extends SortedSet<E> {}
继承于SortSet,多了几个有序的读取函数,和有序的集合获取函数。
Java集合源码分析(一)——集合框架的更多相关文章
- Java 集合源码分析(一)HashMap
目录 Java 集合源码分析(一)HashMap 1. 概要 2. JDK 7 的 HashMap 3. JDK 1.8 的 HashMap 4. Hashtable 5. JDK 1.7 的 Con ...
- java集合源码分析(三):ArrayList
概述 在前文:java集合源码分析(二):List与AbstractList 和 java集合源码分析(一):Collection 与 AbstractCollection 中,我们大致了解了从 Co ...
- java集合源码分析(六):HashMap
概述 HashMap 是 Map 接口下一个线程不安全的,基于哈希表的实现类.由于他解决哈希冲突的方式是分离链表法,也就是拉链法,因此他的数据结构是数组+链表,在 JDK8 以后,当哈希冲突严重时,H ...
- [源码分析] 定时任务调度框架 Quartz 之 故障切换
[源码分析] 定时任务调度框架 Quartz 之 故障切换 目录 [源码分析] 定时任务调度框架 Quartz 之 故障切换 0x00 摘要 0x01 基础概念 1.1 分布式 1.1.1 功能方面 ...
- Java Reference 源码分析
@(Java)[Reference] Java Reference 源码分析 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...
- Java集合源码分析(六)TreeSet<E>
TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneable, j ...
- Java集合源码分析(五)HashSet<E>
HashSet简介 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. HashSet源 ...
- Java集合源码分析(四)Vector<E>
Vector<E>简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长. Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是 ...
- Java集合源码分析(三)LinkedList
LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...
- Java集合源码分析(二)ArrayList
ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...
随机推荐
- ceph客户端服务端属性匹配关系
ceph的server是定期会发布版本,而它的客户端是放到linux 内核当中的,一些属性的支持是依赖于内核版本的,这样就存在一些问题,一些功能后端支持,而客户端旧了:还有可能是客户端用的很新的内核, ...
- TensorFlow_笔记
Tensorflow 1.基本概念 TensorFlow是一个编程系统,使用图(graphs)来表示计算任务,图(graphs)中的节点称之为op(operation),一个op获得0个或多个Tens ...
- 通过phpmyadmin拿下webshell
废话: 1.听说网上卖手机的网站很多是诈骗的,搜到一个499元货到付款的手机网站.有点像诈骗,但倒觉得他是在收集用户信息 2.把网站扔到御剑,搜到phpmyadmin的后台,试试下账号密码居然都是默认 ...
- python-网络安全编程第四天(数据库编程&网络编程)
前言 好几天没更因为寒假放假回家放松了几天 嘿嘿 今天继续开始启动学习模式. python数据库编程 Python DB API访问数据库流程 Python DB API包含的内容 什么是 PyMyS ...
- mysql的索引、视图、存储过程(自我理解总结)
一.索引 索引在MySQL中也叫'键'或者'key',是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要,减少IO次数,加 ...
- 一次看完28个关于ES的性能调优技巧,很赞,值得收藏!
因为总是看到很多同学在说Elasticsearch性能不够好.集群不够稳定,询问关于Elasticsearch的调优,但是每次都是一个个点的单独讲,很多时候都是case by case的解答,本文简单 ...
- Hadoop大数据平台搭建之前期配置(1)
环境:CentOS 7.4 (1708 DVD) 工具:VMware.MobaXterm 一. 网络配置 1. 在VMware中安装虚拟机,此步骤不作赘述. 2. 镜像文件保留在固定目录下,网络适配 ...
- 这份java多线程笔记,你真得好好看看,我还没见过总结的这么全面的
1.线程,进程和多线程 1.程序:指指令和数据的有序集合,其本身没有任何意义,是一个静态的概念 2.进程:指执行程序的一次执行过程,是一个动态的概念.是系统资源分配的单位(注意:很多多线程是模拟出来的 ...
- UnitTest_墨振文档
目录 一.框架介绍 1 二.四大组件 2 三.ddt数据驱动 3 一.框架介绍 unittest框架是python 自带的一个作为单元测试的测试框架,在最初叫pyUnit,相当与Java语言中的Jun ...
- 微软开源的 AI 工具,让旧照片焕发新生
原文地址:Bringing Old Photos Back to Life 原文作者:Ziyu Wan 译者 & 校正:HelloGitHub-小鱼干 & 鸭鸭 写在前面 在 GitH ...