网站首页 > java教程 正文
近被陆陆续续问了几遍HashMap的实现,回答的不好,打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们的程序;另一方面是学习借鉴JDK是如何实现了这么一套优雅高效的类库,提升编程能力。
在介绍具体适合类之前,本篇文章对Java中的集合框架做一个大致描述,从一个高的角度俯视这个框架,了解了这个框架的一些理念与约定,会大大帮助后面分析某个具体类,让我们开始吧。
集合框架(collections framework)
首先要明确,集合代表了一组对象(和数组一样,但数组长度不能变,而集合能)。Java中的集合框架定义了一套规范,用来表示、操作集合,使具体操作与实现细节解耦。
其实说白了,可以把一个集合看成一个微型数据库,操作不外乎“增删改查”四种操作,我们在学习使用一个具体的集合类时,需要把这四个操作的时空复杂度弄清楚了,基本上就可以说掌握这个类了。
设计理念
主要理念用一句话概括就是:提供一套“小而美”的API。API需要对程序员友好,增加新功能时能让程序员们快速上手。
为了保证核心接口足够小,最顶层的接口(也就是Collection与Map接口)并不会区分该集合是否可变(mutability),是否可更改 (modifiability),是否可改变大小(resizability)这些细微的差别。相反,一些操作是可选的,在实现时抛出UnsupportedOperationException即可表示集合不支持该操作。集合的实现者必须在文档中声明那些操作是不支持的。
为了保证最顶层的核心接口足够小,它们只能包含下面情况下的方法:
基本操作,像之前说的“增删改查”
There is a compelling performance reason why an important implementation would want to override it.
此外,所有的集合类都必须能提供友好的交互操作,这包括没有继承Collection类的数组对象。因此,框架提供一套方法,让集合类与数组可以相互转化,并且可以把Map看作成集合。
两大基类Collection与Map
在集合框架的类继承体系中,最顶层有两个接口:
Collection表示一组纯数据
Map表示一组key-value对
一般继承自Collection或Map的集合类,会提供两个“标准”的构造函数:
没有参数的构造函数,创建一个空的集合类
有一个类型与基类(Collection或Map)相同的构造函数,创建一个与给定参数具有相同元素的新集合类
因为接口中不能包含构造函数,所以上面这两个构造函数的约定并不是强制性的,但是在目前的集合框架中,所有继承自Collection或Map的子类都遵循这一约定。
Collection
java-collection-hierarchy
如上图所示,Collection类主要有三个接口:
Set表示不允许有重复元素的集合(A collection that contains no duplicate elements)
List表示允许有重复元素的集合(An ordered collection (also known as a sequence))
Queue JDK1.5新增,与上面两个集合类主要是的区分在于Queue主要用于存储数据,而不是处理数据。(A collection designed for holding elements prior to processing.)
Map
MapClassHierarchy
Map并不是一个真正意义上的集合(are not true collections),但是这个接口提供了三种“集合视角”(collection views ),使得可以像操作集合一样操作它们,具体如下:
把map的内容看作key的集合(map’s contents to be viewed as a set of keys)
把map的内容看作value的集合(map’s contents to be viewed as a collection of values)
把map的内容看作key-value映射的集合(map’s contents to be viewed as a set of key-value mappings)
总结
今天先开个头,后面会陆陆续续来一系列干货,Stay Tuned。
需要说明一点,今后所有源码分析都将基于Oracle JDK 1.7.0_71,请知悉。
$ java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
聚焦最新最前沿最有料的IT技术资讯
IT行业精华内容、产品交流心得
微信ID:weixin51cto
51CTO官方微信
长按二维码关注微互动
其他推荐:51CTO博客
如果你觉得文章还不错,帮我点个赞哦~
或者分享给更多的人^_^谢谢啦~
猜你喜欢
- 2024-11-17 三句话都能解释清楚的java集合类HashSet,你清楚吗?
- 2024-11-17 Java常用的并发集合类(java中的并发是什么意思)
- 2024-11-17 数据结构之集合体系概览 带你了解集合体系中有哪些重要的分类
- 2024-11-17 能懂系列之 List 集合详解(list集合的方法)
- 2024-11-17 100个Java工具类之1:多种集合类型实现排序功能
- 2024-11-17 Java 集合体系有什么?(一)(java集合概述)
- 2024-11-17 「软帝学院」java集合类框架,你了解多少?一
- 2024-11-17 面试官问道:关于java集合类你都搞懂了吗?学会怒怼面试官
- 2024-11-17 跟我学编程 5:Java中常见的集合 知多少?
- 2024-11-17 Java多线程环境下使用的集合类示例详解
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)