JDK源码分析之集合01总体框架

集合类是java提供的工具类,主要包括List、Set、Map和vector等类型。所有的集合相关类都位于java.util.*内。

集合类的总体框架图如下图所示:

对总体框架的说明:

集合框架中最顶层的接口有Iterator、Collection和Map三个。其中Itireator是所有迭代器需要实现的接口,Collection是所有的线性结构集合所要实现的接口,Map是所有的非线性集合所要实现的接口,元素以Key、value的形式保存。

Collection下层中包含了Queue、List和set三个自接口。这三种接口有分别有各自的特点。其中Queue对应的数据结构是队列其特点是提供了两个基本操作:在队尾添加元素和在队列的头部删除元素,具有先进先出的特点;List中元素同样是以线性结构存储,并且可以存在重复元素;Set具有和Collection一样的接口,Set的特点是不允许存放重复元素,放入Set中的元素必须重写equals方法以确保元素的唯一性。再下一层的结构中定义了AbstractCollection、AbstractList、AbstractSet、AbstractSequentialList三个抽象类,在抽象类中实现了部分方法,这种设计使用了适配器的设计模式,这样做的好处是子类可以选择性的实现一些方法。最底层是Collection类系中的具体集合类,有ArrayList、LinkedList、Vector、Stack、HashSet、TreeSet六个集合类。其中ArrayList是采用数组的形式来保存对象,在通过使用索引访问元素的效率相对较高,但是插入删除效率低;是使用链表来保存元素,在使用索引访问元素时效率相对较低,但是插入删除操作效率高;Vector也是使用数组保存元素,但是Vector是支持线程同步的,即同一时刻只支持同一个线程对Vector操作;Stack是使用的栈这种数据结构,只支持在顶端插入和弹出操作;HashSet和TreeSet都不能保存重复元素,但是TreeSet可以以升序保存元素,HashSet通过哈希表的方式保存元素。

Map下层同样定义了一个AbstractMap来实现Map接口中的部分方法,以使得子类可以选择性的实现Map中的方法。Map中的实现类有TreeMap、HashMap、WeakHashMap和HashTable四个。其中TreeMap是以有序的方式保存元素,可以给Map中Key进行排序。HashMap是哈希表数据结构,效率相对要高;HashTable是Dirctionary的子类,是可以将任何Key映射到相应的值,所以在HashTable中不允许key或value存在null,而HashMap中允许存在一个为null的key和任意个位null的value。

Iterator接口下有ListIterator接口,所有的迭代器都必须实现此接口。支持通过迭代器遍历集合元素。

时间: 2024-10-24 23:39:35

JDK源码分析之集合01总体框架的相关文章

JDK源码分析之集合02ArrayList

一.前言 ????有了前一篇对集合类的概述,我们知道ArrayList是属于Collection类系中的一个具体实现类,其特点是长度可以动态改变,集合内部使用数组保存元素.下面我们对源码进行分析. 二.ArrayList源代码分析 ????2.1 类的继承关系 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Ser

JDK源码分析之集合04HashMap

一.前言 ????HashMap是常用的Map实现类,其中可以保存一个key为null的键值对和任意多个key!=null但是value为null的键值对. 二.HashMap源代码分析 2.1.类的继承关系 //Map中定义了Map必须支持的一些操作,abstractMap中添加了其默认实现 public class HashMap<K, V> extends AbstractMap<K, V> implements Map<K, V>, ????????Clonea

JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue

目的:本文通过分析JDK源码来对比ArrayBlockingQueue 和LinkedBlockingQueue,以便日后灵活使用. 1. 在Java的Concurrent包中,添加了阻塞队列BlockingQueue,用于多线程编程.BlockingQueue的核心方法有: boolean add(E e) ,把 e 添加到BlockingQueue里.如果BlockingQueue可以容纳,则返回true,否则抛出异常. boolean offer(E e),表示如果可能的话,将 e 加到B

JDK源码分析之String篇

------------------------------String在内存中的存储情况(一下内容摘自参考资料1)----------------------------------- 前提:先了解下什么是声明,什么时候才算是产生了对象实例 其中x并未看到内存分配,变量在使用前必须先声明,再赋值,然后才可以使用.java基础数据类型会用对应的默认值进行初始化 一.首先看看Java虚拟机JVM的内存块及其变量.对象内存空间是怎么存储分配的 1.栈:存放基本数据类型及对象变量的引用,对象本身不存放

【JDK源码分析】通过源码分析CyclicBarrier

前言 CyclicBarrier它是什么?一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点.类似于朋友之间联系要在中午聚个会,几个朋友全部到齐后才开始喝酒吃菜. 源码 CyclicBarrier属性和构造器 public class CyclicBarrier { // 互斥锁 private final ReentrantLock lock = new ReentrantLock(); // 条件等待 private final Condition trip = lock.new

【JDK】JDK源码分析-CountDownLatch

概述 CountDownLatch 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行. 简单起见,可以把它理解为一个倒数的计数器:初始值为线程数,每个线程结束时执行减 1 操作,当计数器减到 0 时等待的线程再继续执行. 代码分析 CountDownLatch 的类签名和主要方法如下: public class CountDownLatch {} 常用方法为:await().await(long, TimeUnit) 和 countDow

【JDK】JDK源码分析-Semaphore

概述 Semaphore 是并发包中的一个工具类,可理解为信号量.通常可以作为限流器使用,即限制访问某个资源的线程个数,比如用于限制连接池的连接数. 打个通俗的比方,可以把 Semaphore 理解为一辆公交车:车上的座位数(初始的“许可” permits 数量)是固定的,行驶期间如果有人上车(获取许可),座位数(许可数量)就会减少,当人满的时候不能再继续上车了(获取许可失败):而有人下车(释放许可)后就空出了一些座位,其他人就可以继续上车了. 下面具体分析其代码实现. 代码分析 Semapho

Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

(一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和算法实现细节,只需要用这些类创建一些对象,然后直接应用就可以了,这样就大大提高了编程效率. (二)集合框架包含的内容: (三)集合框架的接口(规范)   Collection接口:存储一组不唯一,无序的对象 List接口:存储一组不唯一,有序的对象 Set接口:存储一组唯一,无序的对象 Map接口:

JDK源码分析-ArrayList分析

花了两个晚上的时间研究了一下ArrayList的源码, ArrayList 继承自AbstractList 并且实现了List, RandomAccess, Cloneable, Serializable 通过实现这三个接口 就具备了他们的功能 RandomAccess 用来表明其支持快速(通常是固定时间)随机访问 Cloneable可以克隆对象 Serializable 对象序列化就是把一个对象变为二进制的数据流的一种方法,通过对象序列化可以方便地实现对象的传输和存储,Serializable