集合库与方便使用集合

由于集合是我们经常都要用到的一种工具,所以一个集合库是十分必要的,它应该可以方便地重复使用。这样一来,我们就可以方便地取用各种集合,将其插入自己的程序。Java提供了这样的一个库,尽管它在Java 1.0和1.1中都显得非常有限(Java 1.2的集合库则无疑是一个杰作)。

1. 下溯造型与模板/通用性
为了使这些集合能够重复使用,或者“再生”,Java提供了一种通用类型,以前曾把它叫作“Object”。单根结构意味着、所有东西归根结底都是一个对象”!所以容纳了Object的一个集合实际可以容纳任何东西。这使我们对它的重复使用变得非常简便。
为使用这样的一个集合,只需添加指向它的对象句柄即可,以后可以通过句柄重新使用对象。但由于集合只能容纳Object,所以在我们向集合里添加对象句柄时,它会上溯造型成Object,这样便丢失了它的身份或者标识信息。再次使用它的时候,会得到一个Object句柄,而非指向我们早先置入的那个类型的句柄。所以怎样才能归还它的本来面貌,调用早先置入集合的那个对象的有用接口呢?
在这里,我们再次用到了造型(Cast)。但这一次不是在分级结构中上溯造型成一种更“通用”的类型。而是下溯造型成一种更“特殊”的类型。这种造型方法叫作“下溯造型”(Downcasting)。举个例子来说,我们知道在上溯造型的时候,Circle(圆)属于Shape(几何形状)的一种类型,所以上溯造型是安全的。但我们不知道一个Object到底是Circle还是Shape,所以很难保证下溯造型的安全进行,除非确切地知道自己要操作的是什么。
但这也不是绝对危险的,因为假如下溯造型成错误的东西,会得到我们称为“违例”(Exception)的一种运行期错误。我们稍后即会对此进行解释。但在从一个集合提取对象句柄时,必须用某种方式准确地记住它们是什么,以保证下溯造型的正确进行。
下溯造型和运行期检查都要求花额外的时间来运行程序,而且程序员必须付出额外的精力。既然如此,我们能不能创建一个“智能”集合,令其知道自己容纳的类型呢?这样做可消除下溯造型的必要以及潜在的错误。答案是肯定的,我们可以采用“参数化类型”,它们是编译器能自动定制的类,可与特定的类型配合。例如,通过使用一个参数化集合,编译器可对那个集合进行定制,使其只接受Shape,而且只提取Shape。
参数化类型是C++一个重要的组成部分,这部分是C++没有单根结构的缘故。在C++中,用于实现参数化类型的关键字是template(模板)。Java目前尚未提供参数化类型,因为由于使用的是单根结构,所以使用它显得有些笨拙。但这并不能保证以后的版本不会实现,因为“generic”这个词已被Java“保留到将来实现”(在Ada语言中,“generic”被用来实现它的模板)。Java采取的这种关键字保留机制其实经常让人摸不着头脑,很难断定以后会发生什么事情。

时间: 2025-01-25 12:27:55

集合库与方便使用集合的相关文章

java集合问题-控制台录入将内容添加到集合中,但是在集合遍历的时候变成了死循环,代码在下面,求指点迷津

问题描述 控制台录入将内容添加到集合中,但是在集合遍历的时候变成了死循环,代码在下面,求指点迷津 ArrayList<String> al = new ArrayList<String>(); Scanner sc = new Scanner(System.in); while(sc.hasNext()) { String st = sc.next(); if("quit".equals(st)){ break; } al.add(st); } Iterator

Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)

a:数据库的相关知识: (1):一个表能否有多个主键:不能: (2):为什么要设置主键:数据库存储的数据都是有效的,必须保持唯一性: (3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即主键,所有为了方便用id列,因为id是数据库系统维护可以保证唯一,所以就把这列作为主键,简单的说为了方便:如果找不到合适的列,除了使用id列以为作为主键,也可以使用联合主键,即多列的值作为一个主键,从而确保了记录的唯一性,即为联合主键: Hibernate的映射很重要哦,如果是一般的映射,很容易掌握

isl 0.10发布 整数集合库

isl 是Integer Set Library的简写,是一款操作集和线性约束范围内整数点关系的库.支持的操作集包括:交集.并集.差集.空虚检查,凸壳.仿射包(整数).整数投影,以及使用参数整数规划进行最小限度的字典计算.它还包括一个整数的规划求解基于广义的基础. &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; isl 0.10该版本支持多准仿射表达的改善和修复各种小错误. 软件信息:http://www.kot

C#中判断一个集合是否是另一个集合的子集的简单方法_C#教程

看到这个标题,我们首先想到的是循环遍历其中一个数组,判断数组中的每个元素是否都在另一个数组中出现了,以此来判断该数组是不是另一个数组的子集,但是这样做就太过复杂了,有没有简单一点的方法呢? 打个比方,有这样的两个集合: 复制代码 代码如下: string[] bigArr = new string[] { "a", "b", "c" }; string[] smallArr = new string[] { "a", &quo

SQL 比较一个集合是否在另一个集合里存在的方法分享_MsSql

复制代码 代码如下: DECLARE @c INT DECLARE @c2 INT SELECT @c = COUNT(1) FROM dbo.SplitToTable('1|2|3|4', '|') SELECT @c2=COUNT(1) FROM dbo.SplitToTable('1|2|3|4', '|') a INNER JOIN dbo.SplitToTable('1|2|3|', '|') b ON a.value = b.value IF @c = @c2 SELECT 'ok'

通用库动态集合模板类

  /**////通用库动态集合模板类/**//** * 通用库4.0版<br> * 这是一个集合类,这个类的元素存放是一个有序的数组.这个类的元素查找方法为二分查找. * 这个类提供了类相关的所有功能.集合的方法有交集*,并集+,差集-,除此之后,还有*=,+=,-=等对应方法. * 集合类通过Contains,检查指定元素是否在集合中 * @author zdhsoft(祝冬华) * @version 4.0 * @date 2008-04-01 * @file xset.h */#ifn

JAVA编程思想 课程进展 一

编程 第1章 对象入门 "为什么面向对象的编程会在软件开发领域造成如此震憾的影响?" 面向对象编程(OOP)具有多方面的吸引力.对管理人员,它实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.易于维护的设计方案.对程序员,对象模型显得如此高雅和浅显.此外,面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务.每个人都可从中获益,至少表面如此.如果说它有缺点,那就是掌握它需付出的代价.思考对象的时候,需要采用形象思维,而不是程序化的思维.与程序

thinking in java

写在前面的话 引言: 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重新使用接口 1.5.1 改善基础类: 尽管extends关键字暗示着我们要为接口"扩展"新功能,但实情并非肯定如此.为区分我们的新类,第二个办法是改变基础类一个现有函数的行为.我们将其称作"改善"那个函数. 为改善一个函数,只需为衍生类的函数建立一个新定义即可.我们的目标是:"尽管使用的函数接口未变,但它的新版本具

Swift数组、字典和集合

原文出自:标哥的技术博客 前言 Swift语言提供Array.Set和Dictionary三种基本的集合类型用来存储集合数据.数组是有序的数据集:集合是无序无重复的数据集:而字典是无序的键值对数组集. Swift的Array.Set和Dictionary类型被实现为泛型集合.因此,它所存储的元素的类型必须是一致的,同样,我们取出来的数据类型也是明确的. 集合的可变性(Mutability Of Collections) 如果创建一个Arrays.Sets或Dictionaries并且把它分配成一