第3章 Java中的数据结构——集合类
本章将通过讲解Java集合类的具体语法和使用方式,来向大家展示Java在数据结构方面编程的强大功能。
集合类的这些强大功能,源自于Java具有的面向对象思想特性。所以,希望大家在学习这个章节的时候,把集合类的语法同面向对象思想中的“通过继承抽象基类功能”和“通过多态屏蔽逻辑动作细节”等原则结合起来,这样能更好地从模块层次的角度理解和运用Java集合类。
3.1 集合类与数据容纳
Java用集合类来容纳代码中的不同种类数据,这种容纳是建立在未知的基础上,即Java要用有限种类的集合类,来容纳代码中无限种类的数据对象。
用生活里的场景来对应的话,Java的集合类需要设计成“能容纳液态气态和固态等不同类型物质”的容器,要设计这样的“**容器”确实很困难,但JDK 的设计者们通过借鉴面向对象思想里的“多态”,实现了这个需求。
3.1.1 在项目中自定义数据类型的难处
如果我们在项目运行前,事先为项目代码准备好所有类型的数据对象,并根据这些数据对象的不同类型,为它们在内存里分配好空间,这是非常理想的,但事实上,我们做不到这点。
比如,在关于天气预报的项目里,我们需要一个对象来保存描述温度的信息,这个问题看上去很好解决,定义一个变量就行了,但没有那么简单。
如果描述温度信息的格式有多种,有用数字型的格式(比如多少度),也有用字符型的格式(比如 “很冷”),并且程序员只有在接收到这个信息的时候才能明确地知道信息的格式,事情就比较麻烦。为了保证能容纳所有类型的数据,我们不得不用Java语言所有对象的老祖宗类——Object类型数据来接收这个温度信息。
但是,如果问题变得再复杂点呢?如果我们在代码里需要用一个(或一组)对象来描述**里所有来访的客户信息,这样,除非这段代码被运行,否则我们甚至不知道当天会来多少客户和客户的种类,这给我们的编程带来了很大的难题。因为我们不知道代码所需要的对象的数目和种类。所以在代码里,要求能够在任何时候、任何地点创建任意数量的任何类型对象。
这对代码的要求似乎高了些,但是,很不幸的是,在编程中这是个“常规”要求。不过,使用数据结构的思想能够较好地解决这一问题。
3.1.2 什么是数据结构
数据结构是在计算机编程领域里被广泛使用的术语,它用来研究数据对象的内部构成,即这个数据对象由哪些基本的数据元素构成,这个数据对象以什么方式构成,以及它呈什么结构。
数据结构主要研究数据的各种逻辑结构和存储结构,以及对不同种数据类型的各种操作。因此,数据结构主要有两方面的内容:数据的逻辑存储结构和对数据的操作。
Java的集合类可以很好地用来描述基于Java语言的数据结构,在本章里,我们不会具体描述如何实现数据结构内部细节的内容,而是将通过学习Java的集合,在了解其数据组织方式和操作的基础上,熟悉这些集合类的用途和特长,为能够在项目中很好地使用这些集合类打下坚实的基础。
3.1.3 Java集合中的两类数据结构
归纳起来讲,Java的集合可以分为两类,**类是以数组为代表,这类集合可以描述线性表类型的数据结构,第二类是以Map为代表,这类集合可以描述“键值对”类型的数据结构。
描述**类数据结构的集合是以Collection为基类,在Collection类里,封装了线性表的插入、删除等基本操作;而数据结构的集合是以Map为基类。两类集合分别通过继承和扩展这两个基类,可以逐渐细化,从而得到诸如堆栈和哈希表之类的数据集合对象。
这两类不同类型的集合,可以很好地在各种应用中存储各种类型的数据,所以说,熟悉了这两类集合,就可以熟悉Java语言下的两类数据结构。
……