JCF之概述

来源:互联网 发布:数据研发工程师笔试题 编辑:程序博客网 时间:2024/06/09 19:12

1.1、什么是容器框架

那么有了容器的概念,什么是容器框架呢?容器框架是为表示和操作容器而规定的一种统一的标准的体系结构。任何容器框架都包含三大块内容:对外的接口、接口的实现和对容器运算的算法。

接口:即表示容器的抽象数据类型。接口提供了让我们对容器中所表示的内容进行单独操作的可能。

实现:也就是容器框架中接口的具体实现。实际它们就是那些可复用的数据结构。

算法:在一个实现了某个容器框架中的接口的对象身上完成某种有用的计算的方法,例如查找、排序等。这些算法通常是多态的,因为相同的方法可以在同一个接口被多个类实现时有不同的表现。事实上,算法是可复用的函数。

C++中的标准模版库(STL就是众所周知的容器框架的绝好例子。

1.2、容器框架对我们编程有何助益

到底容器框架对我们编程有什么好处呢?

     它减少了程序设计的辛劳。容器框架通过提供有用的数据结构和算法使你能集中注意力于你的程序的重要部分上,而不是为了让程序能正常运转而将注意力于低层设计上。通过这些在无关API之间的简易的互用性,使你免除了为改编对象或转换代码以便联合这些API而去写大量的代码。

    它提高了程序速度和质量。容器框架通过提供对有用的数据结构和算法的高性能和高质量的实现使你的程序速度和质量得到提高。因为每个接口的实现是可互换的,所以你的程序可以很容易的通过改变一个实现而进行调整。另外,你将可以从写你自己的数据结构的苦差事中解脱出来,从而有更多时间关注于程序其它部分的质量和性能。

     通过统一的语言实现来回操作集合,以提供无关API之间的互操作性。(Provides interoperability between unrelated APIs by establishing a common language to pass collections back and forth.)

     减少学习和使用新的API 的辛劳。许多API天生的有对容器的存储和获取方法。在过去,这样的API都有一些子API帮助操纵它的容器内容,因此在那些特殊的子API之间就会缺乏一致性,你也不得不从零开始学习,并且在使用时也很容易犯错。而标准容器框架接口的出现使这个问题迎刃而解。

     减少了设计新API的努力。设计者和实现者不用再在每次创建一种依赖于容器内容的API时重新设计,他们只要使用标准容器框架的接口即可。

 容器框架鼓励软件的复用。对于遵照标准容器框架接口的新的数据结构天生即是可复用的。同样对于操作一个实现了这些接口的对象的算法也是如此。

1.3 先从整体上认识Java容器框架(Java Collections Framework)

此图中蓝色为抽象类、深红色表示接口(Arrays除外)、绿色表示具体容器类

Java容器框架包含以下内容:

· Collection Interfaces- 代表不同类型的容器,例如,sets, lists and maps. 这些接口是框架的基础。

· General-purpose Implementations- 相关容器接口的基本实现。

· Legacy Implementations- VectorHashtable是早期版本的容器类,现在它们已被改进,实现了容器的相关接口。

· Special-purpose Implementations- 为一些特殊情况的使用而提供的实现。这些实现展示了非标准的性能特点和使用限制或者行为。

· Concurrent Implementations- 为高度并行环境下的使用提供的实现。Implementations designed for highly concurrent use.

· Wrapper Implementations- 添加功能(例如同步)到别的实现中。

· Convenience Implementations- 容器相关接口的高性能“迷你实现”。

· Abstract Implementations- 容器相关接口的部分实现,方便用户自定义实现。

· Algorithms一些静态方法,完成一些有用的集合操作功能,例如对集合元素排序等。

· Infrastructure为集合接口提供必要支持的接口。

· Array Utilities- 基本类型数组或者引用类型数组的相关操作。严格意义上来说,这不是Java容器框架的一部分。

蓝色标记部分是我本次学习重点关注的部分。因为这些是一个容器框架的基础。


Collection Interfaces

JCF有14个容器接口。其中最基本的是接口Collection。继承Collection的接口有: SetListSortedSetNavigableSetQueueDequeBlockingQueue BlockingDeque其余几个接口,MapSortedMapNavigableMapConcurrentMap 和 ConcurrentNavigableMap并不继承Collection,因为它们代表的实际上是一种映射关系,但我们可以像操作容器一样操作它们。

关于容器框架的介绍中就已经提到,任何容器框架都包含三大块内容:对外的接口、接口的实现和对容器运算的算法。

算法并不是我本次学习源码的初衷,我的初衷的想弄懂JCF的内部设计结构,提升自己。如果时间充足,最后也会看一下算法。

算法都可以通过Collections类进行调用,这是一个帮助类

Java.util包中有一个类Collections,该类非常“干净”,它只包含了一些静态方法,而每一个方法都是对容器的一种运算(或者说一个算法)

例如:

static void shuffle(List<?> list, Random rnd);

该方法根据设定的随机种子随机排列List中的元素。


Java2容器类(也称集合类)类库的用途是“保存对象”,而在java中保存对象的方式还有数组,数组与其他种类的容器的区别在于:

1. 效率:在Java中数组是一种效率最高的存储和随机访问对象引用的序列方式(无论是使用数组还是容器类保存对象时保存的只是对象的引用!这些引用指向堆中创建的一个真实对象)。因为数组就是一个简单的线性序列,这使得元素访问非常快速。

2. 类型:当你创建一个数组的时候,它只能保存特定类型的对象引用,也包括基本数据类型,其他任何类型将不允许放入其中,而容器则可以放入任何类型的对象引用。且放入容器中的对象都被向上转型成Object,所以容器只保存Object的引用。Java5开始支持泛型,从而支持指定容器存储的数据类型。

  看懂源码需要一些基础知识,JDK1.5引入了泛型机制,所以源码中充斥着泛型代码,需要对Java的泛型有所了解。使用过STL,对Java的泛型只知道个大概,所以先学习了一下。泛型相关知识请看博客:Java泛型初探点击打开链接



原创粉丝点击