5

Java集合框架综述

 3 years ago
source link: http://www.androidchina.net/6447.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在介绍具体适合类之前,本篇文章对Java中的集合框架做一个大致描述,从一个高的角度俯视这个框架,了解了这个框架的一些理念与约定,会大大帮助后面分析某个具体类,让我们开始吧。

集合框架(collections framework)

首先要明确,集合代表了一组对象(和数组一样,但数组长度不能变,而集合能)。Java中的集合框架定义了一套规范,用来表示、操作集合,使具体操作与实现细节解耦。

其实说白了,可以把一个集合看成一个微型数据库,操作不外乎“增删改查”四种操作,我们在学习使用一个具体的集合类时,需要把这四个操作的时空复杂度弄清楚了,基本上就可以说掌握这个类了。

主要理念用一句话概括就是:提供一套“小而美”的API。API需要对程序员友好,增加新功能时能让程序员们快速上手。

为了保证核心接口足够小,最顶层的接口(也就是Collection与Map接口)并不会区分该集合是否可变(mutability),是否可更改(modifiability),是否可改变大小(resizability)这些细微的差别。相反,一些操作是可选的,在实现时抛出UnsupportedOperationException即可表示集合不支持该操作。集合的实现者必须在文档中声明那些操作是不支持的。

为了保证最顶层的核心接口足够小,它们只能包含下面情况下的方法:

  1. 基本操作,像之前说的“增删改查”
  2. There is a compelling performance reason why an important implementation would want to override it.

此外,所有的集合类都必须能提供友好的交互操作,这包括没有继承Collection类的数组对象。因此,框架提供一套方法,让集合类与数组可以相互转化,并且可以把Map看作成集合。

两大基类Collection与Map

在集合框架的类继承体系中,最顶层有两个接口:

  • Collection表示一组纯数据
  • Map表示一组key-value对

一般继承自CollectionMap的集合类,会提供两个“标准”的构造函数:

  • 没有参数的构造函数,创建一个空的集合类
  • 有一个类型与基类(CollectionMap)相同的构造函数,创建一个与给定参数具有相同元素的新集合类

因为接口中不能包含构造函数,所以上面这两个构造函数的约定并不是强制性的,但是在目前的集合框架中,所有继承自CollectionMap的子类都遵循这一约定。

Collection

Java集合框架综述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.)

Java集合框架综述

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)

转载请注明:Android开发中文站 » Java集合框架综述


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK