Java最新实用教程第八章群体对象的组织
Java最新实用教程
2009年 7月 27日星期一 2
学习目的:
掌握用数组存储对象的方法
了解集合的框架
掌握向量,Enumeration及 Iterator接口的功用
掌握 Map接口和 Hashtable的用法
学习重点:
对象数组
向量
Iterator接口
Hashtable
Map接口
Java最新实用教程
2009年 7月 27日星期一 3
第 八 章 群体对象的组织本章提要:
1,对象数组
用对象数组存储对象
对数组元素进行排序
在已排序的数组中查找
2.集合
Java集合框架
向量
Enumeration及 Iterator接口
Map接口及其类层次
哈希表
Java最新实用教程
2009年 7月 27日星期一 4
8.1 对象数组数组的定义,int[] a1;或 int a1[];
a1并不是一个实际的数组对象,而只是一个引用而已
,代表某个数组,但是并没有对应空间。在 Java中,
所有的对象(包括数组)必须由 new操作符动态分配内存:
int[] a1= new int[8];
基本数据类型数值的数组元素将会被赋默认值为 0,布尔型数组的默认值为 false,对于非基本数据类型的数组引用,则赋值为空。
例 8-1
8.1.1 用数组存储对象
Java最新实用教程
2009年 7月 27日星期一 5
排序,即对数据按某种顺序进行排序,如递增或递减等。这是最重要的计算型应用之一。如,电话公司对电话用户先按姓排序,然后在此基础上再按名排序,以便查询电话号码。许多单位都要对大量的数据进行排序,以便进行管理。 java.util.Arrays类包含一套排序数组的类方法 。
例 8-2
8.1.2对数组元素进行排序
Java最新实用教程
2009年 7月 27日星期一 6
折半法查找算法主要是对已排序数组进行查找,其每进行一次比较都减少一半要查找的数组元素。该算法取数组中加位置的元素和查找关键字比较,相等则查找结束,返回元素下标。否则,把要查找的数组元素减少一半,再继续查找数组剩下的一半。若关键字比数组中间位置的元素小(对升序数组),则在数组的前半部分元素中继续查找;否则,在后半部分元素中继续查找。如果查找关键字不等于所查找的那一半数组的中间位置元素值,这个算法再进行折半,在原数组的四分之一中查找,依次类推。直到找到与关键字相等的数组元素,或查找仅剩下一个仍不等于关键字的数组元素(即没有找到关键字)。
例 8-3
8.1.3在已排序数组中查找
Java最新实用教程
8.2 集 合通常情况下,把具有相同性质的一类物品,汇聚成一个整体,就可以称为集合。比如,用 Java编程的所有程序员
,全体中国人等。通常集合有两种表示法,一种是列举法,比如集合 A={
1,2,3,4},另一种是性质描述法,比如集合 B={ X|0<X<100且 X属于整数}。
Java最新实用教程
2009年 7月 27日星期一 8
集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
接口:即表示集合的抽象数据类型。接口提供了让用户对集合中所表示的内容进行单独操作的可能

实现:也就是集合框架中接口的具体实现。实际它们就是那些可复用的数据结构。
算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法,例如查找、排序等。
8.2.1Java集合框架
Java最新实用教程
2009年 7月 27日星期一 9
Java2的集合框架,其核心主要有三类,List,Set和
Map
8.2.1Java集合框架
Java最新实用教程
2009年 7月 27日星期一 10
向量也就是 Vector 类。提供了实现可增长数组的功能,随着更多元素加入其中,数组变得更大。在删除一些元素之后,数组变小。
Vector类有三个构造函数:
public Vector(int initialCapacity,int capacityIncrement)
public Vector(int initialCapacity)
public Vector()
Vector类运行时创建一个初始的存储容量 initialCapacity
,存储容量是以 capacityIncrement 变量定义的增量增长。初始的存储容量和 capacityIncrement 可以在 Vector 的构造函数中定义。
8.2.2向量
Java最新实用教程
2009年 7月 27日星期一 11
Vector 类提供的访问方法支持类似数组运算和与 Vector 大小相关的运算。它允许向向量中增加、删除和插入元素。它们也允许测试矢量的内容和检索指定的元素,与大小相关的运算允许判定字节大小和矢量中元素的数目。
addElement(Object obj):把组件加到向量尾部,同时大小加 1,向量容量比以前大 1。
insertElementAt(Object obj,int index):把组件加到所定索引处,此后的内容向后移动 1 个单位。
setElementAt(Object obj,int index):把组件加到所定索引处,此处的内容被代替。
removeElement(Object obj),把向量中含有本组件内容移走。
removeAllElements(),把向量中所有组件移走,向量大小为 0
例 8-4
8.2.2向量
Java最新实用教程
2009年 7月 27日星期一 12
Enumeration接口提供了连续操作 Vector中元素的方法,这可以通过 Vector中的 elements()方法来获取一个
Enumeration接口的对象,可以用一个 while循环来遍历其中的元素。如:
Enumeration e = v.elements() ;
while(e.hasMoreElements())
{System.out.println(e.nextElement());}
8.2.3Enumeration及 Iterator接口
Java最新实用教程
2009年 7月 27日星期一 13
Iterator
Iterator即跌代器。其职责便是遍历或选中集合中的元素。客户端程序员不需要知道或在意该集合的底层究竟如何实现。 Iterator接口可以实现如下功能:
调用 iterator(),要求容器返回一个 iterator对象。当调用 iterator的 next()方法时,它将返回集合中的第一个元素。
调用 next()取得集合中的下一个元素。
调用 hasNextIo检查集合中是否还有其他元素。
调用 remove()移去跌代器中最近传回的元素。
例 8-5 Cat类
8.2.3Enumeration及 Iterator接口
Java最新实用教程
2009年 7月 27日星期一 14
Map接口用于维护键 /值对( key/value pairs)。该接口描述了从不重复的键到值的映射。
添加、删除键值的操作:
Object put(Object key,Object value):将互相关联的一个关键字与一个值放入该映像。如果该关键字已经存在,那么与此关键字相关的新值将取代旧值。方法返回关键字的旧值,如果关键字原先并不存在,则返回 null。
Object remove(Object key):从映像中删除与 key
相关的映射。
void putAll(Map t):将来自特定映像的所有元素添加给该映像
void clear():从映像中删除所有映射。
“键和值都可以为 null。但是,不能把 Map作为一个键或值添加给自身。”
8.2.4Map接口及其类层次
Java最新实用教程
2009年 7月 27日星期一 15
查询键值的操作:
Object get(Object key):获得与关键字 key
相关的值,并且返回与关键字 key相关的对象,如果没有在该映像中找到该关键字
,则返回 null。
boolean containsKey(Object key):判断映像中是否存在关键字 key。
boolean containsValue(Object value):判断映像中是否存在值 value。
int size():返回当前映像中映射的数量。
boolean isEmpty(),判断映像中是否有任何映射。
8.2.4Map接口及其类层次
Java最新实用教程
2009年 7月 27日星期一 16
视图操作,
视图操作:处理映像中键 /值对组。
Set keySet():返回映像中所有关键字的视图集:“因为映射中键的集合必须是惟一的,用 Set支持,还可以从视图中删除元素,同时,关键字和它相关的值将从源映像中被删除,但是不能添加任何元素。”
Collection values():返回映像中所有值的视图集:“因为映射中值的集合不是惟一的,用 Collection支持,还可以从视图中删除元素,同时,值和它的关键字将从源映像中被删除,但是不能添加任何元素。”
Set entrySet():返回 Map.Entry对象的视图集,即映像中的关键字 /值对:“因为映射是惟一的,用 Set支持,还可以从视图中删除元素,同时,这些元素将从源映像中被删除
,但是不能添加任何元素。”
8.2.4Map接口及其类层次
Java最新实用教程
2009年 7月 27日星期一 17
哈希表的原理,
哈希表,又称为散列表,是线性表中一种重要的存储方式和检索方法
,可以对节点进行快速检索。其基本思想是:由结点的关键码值决定结点的存储地址,即以关键码值 k为自变量,通过一定的函数关系 h
(称为散列函数),计算出对应的函数值 h( k)来,将这个值解释为结点的存储地址,将结点存入该地址中,检索时,根据要检索的关键码值,用同样的散列函数计算出地址,然后,到相应的地址中去获取要找的结点数据。
哈希表最重要的一个指标是负载因子,即哈希表中结点数目与表中能容纳的总结点数的比值,它描述了哈希表的饱和程度,负载因子越接近 1.0,内存的使用效率越高,元素的寻找时间越长,同样,负载因子越接近 0.0,元素的寻找时间越短,但内存的浪费越大。通常,
Hashtable类的负载因子为 0.75。
8.2.5哈希表
Java最新实用教程
2009年 7月 27日星期一 18
Hashtable类:
建哈希表对象
public Hashtable(int initialCapacity,float loadFactor):用指定的初始的容量和指定的负载因子构造一个新的空散列表。
public Hashtable(int initialCapacity):用指定的初始的容量和默认的加载因数构造一个新的空散列表。
public Hashtable():用默认的容量和负载因子构造一个新的空散列表。
充填数据
public synchronized Object put(Object key,Object value):
在该散列表中映射指定的键到指定的值,键和值都不能为 null。
查询数据
public synchronized Object get(Object key):参数 key为在该散列表中的一个键,返回指定的键在这个散列表中的映射值。
8.2.5哈希表
Java最新实用教程
2009年 7月 27日星期一 19
8.3 本章小结
学习了数组和集合的相关知识
详细讨论了对象数组和常用的集合类的功能。
实现可增长数组的 Vector类
用于遍历集合中所有元素的 Enumeration和
Iterator接口
用于维护键 /值对的 Map接口
按照特定的方式来存储和检索数据的
Hashtable类等。