>>集合框架

Java集合框架包含了大部分Java开发中用到的数据结构,主要包括
List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)几个部分。

>>Collection系列

画类图好麻烦,强烈推荐processon.com
注意,在Eclipse中使用Ctrl+T查看Collection接口的继承与实现关系,
会发现好多用于并发的相关容器,以及第三方的包实现了这个接口,这里只考察原生Java集合里的一些常用实现,其他的接口也是。

(1)Collection接口
Collection是List、Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,主要分为List和Set以及Queue。
(2)List接口
List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。
(3)Set接口
Set是一个继承于Collection的接口,即Set也是集合中的一种。Set是没有重复元素的集合。
(4)Queue接口

(5)Iterator接口
Iterator集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口,包括:是否存在下一个元素、获取下一个元素、删除当前元素。
(6)LinkedList类

  • LinkedList的本质是双向链表。
  • LinkedList继承于AbstractSequentialList,并且实现了Dequeue接口。
  • LinkedList包含两个重要的成员:header和size。
  • header是双向链表的表头,它是双向链表节点所对应的类Entry的实例。Entry中包含成员变量:previous,next,element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。
  • size是双向链表中节点的个数。
  • LinkedList支持多种遍历方式。不要采用随机访问的方式去遍历LinkedList,而采用foreach逐个遍历的方式。
  • 对元素的插入、添加、移除操作,与ArrayList相比,LinkedList 更快,因为,当一个元素被添加到集合内部的任意位置时,LinkedList 不需要重新调整数组大小或者更新索引。

(7)ArrayList类

  • ArrayList是一个数组列表,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List、RandomAccess、Cloneable、java.io.Serializable这些接口。
  • ArrayList实际上是通过一个数组去保存数据的。当我们构造ArrayList时;若使用默认构造函数,则ArrayList的默认容量大小是10。
  • 当ArrayList容量不足以容纳全部元素时,ArrayList会重新设置容量:新的容量=“(原始容量x3)/2 + 1”。

(8)Vector类
Vector是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。

(9)Stack类
Stack是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。

>>Map系列

先看一下类图关系:

下面针对类图中的实现进行简单分析。

下面针对类图中的实现进行简单分析。
(1)Map接口
(2)HashMap类

  • HashMap基于哈希表的Map接口的实现。,它存储的内容是键值对(key-value)映射。
  • HashMap继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
  • HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
  • HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。
  • HashMap是通过”拉链法”实现的哈希表。

(3)TreeMap类
TreeMap是有序的散列表,它是通过红黑树实现的。它一般用于单线程中存储有序的映射。
(4)WeakHashMap类
WeakHashMap也是基于“拉链法”实现的散列表,它一般也用于单线程程序中。相比HashMap,WeakHashMap中的键是“弱键”,当“弱键”被GC回收时,它对应的键值对也会被从WeakHashMap中删除;而HashMap中的键是强键。
(5)HashTable类

  • Hashtable也是基于“拉链法”实现的散列表。Hashtable的几乎所有函数都是同步的,即它是线程安全的,支持多线程。
  • Hashtable的key、value都不可以为null,否则,会抛出异常NullPointerException。

(6)Directionary抽象类
(7)Enumeration接口

>>Collections和Arrays工具类

Arrays和Collections是用来操作数组、集合的两个工具类,
例如在ArrayList和Vector中大量调用了Arrays.Copyof()方法,而Collections中有很多静态方法可以返回各集合类的synchronized版本,即线程安全的版本。

参考 Java集合源码剖析

Java集合源码学习(一)集合框架概览的更多相关文章

  1. Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析

    经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...

  2. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  3. Java并发包源码学习之AQS框架(一)概述

    AQS其实就是java.util.concurrent.locks.AbstractQueuedSynchronizer这个类. 阅读Java的并发包源码你会发现这个类是整个java.util.con ...

  4. java Integer 源码学习

    转载自http://www.hollischuang.com/archives/1058 Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的 ...

  5. Java集合源码学习(三)LinkedList分析

    前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂度很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的 ...

  6. Java集合源码学习(三)LinkedList

    前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂度很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的 ...

  7. Java集合源码学习(五)几种常用集合类的比较

    这篇笔记对几个常用的集合实现,从效率,线程安全和应用场景进行综合比较. >>ArrayList.LinkedList与Vector的对比 (1)相同和不同都实现了List接口,使用类似.V ...

  8. Java集合源码学习(四)HashMap分析

    ArrayList.LinkedList和HashMap的源码是一起看的,横向对比吧,感觉对这三种数据结构的理解加深了很多. >>数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据 ...

  9. Java集合源码学习(二)ArrayList分析

    >>关于ArrayList ArrayList直接继承AbstractList,实现了List. RandomAccess.Cloneable.Serializable接口,为什么叫&qu ...

随机推荐

  1. Xcode 中的黄色文件夹/蓝色文件夹

    蓝色.黄色首先是和你导入文件夹时的勾选项目有关系: 黄色:-->group 蓝色:--> folder 在group中的.m/.h文件,#import "xxxxx.h" ...

  2. 31 GroupSock(AddressString)——live555源码阅读(四)网络

    31 GroupSock(AddressString)——live555源码阅读(四)网络 31 GroupSock(AddressString)——live555源码阅读(四)网络 简介 Addre ...

  3. 14 BasicHashTable基本哈希表类(一)——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  4. 修改apache上传文件大小限制

    PHP上传文件大小限制解决方法: 第一: 在php.ini里面查看如下行: upload_max_filesize = 8M    post_max_size = 10M    memory_limi ...

  5. java获取对象属性类型、属性名称、属性值

    /** * 根据属性名获取属性值 * */ private Object getFieldValueByName(String fieldName, Object o) { try { String ...

  6. spring的对象属性相同(类型,名字)拷贝

    A类: package test; /** * Created by gmq on 2015/12/4. */ public class A { private String aa; private ...

  7. java学习笔记--IO流

    第十二章大纲: I/O input/output 输入/输出 一.创建文件,借助File类来实现 file.createNewFile() : 创建文件 file.exists() : 判断文件是否存 ...

  8. perl 引用(一)

    1. 普通变量引用 variable reference 引用就好比C语言的指针,引用变量存储被引用变量的地址.赋值时注意要在变量前加上 \;使用时要多加一个 $ . 当然,引用也可以成为简单变量,可 ...

  9. 15. javacript高级程序设计-Canvas绘图

    1. Canvas绘图 HTML5的<canvas>元素提供了一组JavaScript API,让我们可以动态的创建图形和图像.图形是在一个特定的上下文中创建的,而上下文对象目前有两种. ...

  10. MongoDB 索引相关知识

    背景: MongoDB和MySQL一样,都会产生慢查询,所以都需要对其进行优化:包括创建索引.重构查询等.现在就说明在MongoDB下的索引相关知识点,可以通过这篇文章MongoDB 查询优化分析了解 ...