类集笔记摘要


类集接口:

Collection能使你操作对象组,位于类集层次结构的顶层
List扩展Collection去处理序列(对象的列表)
Set扩展Collection去处理集合,集合必须包含唯一元素
SortedSet扩展Set去处理排序集合

Collection的方法摘要:
add( )方法可以将对象加入类集。注意add( )带一个Object类型的参数。因为Object
是所有类的超类,所以任何类型的对象可以被存储在一个类集中。然而原始类型可能不行。
例如,一个类集不能直接存储类型int,char,double等的值。当然如果想存储这些对象,也
可以使用在第14章中介绍的原始类型包装器之一。
addAll( )方法将一个类集的全部内容增加到另一个类集中。
remove( )方法将一个对象删除。
为了删除一组对象,可以调用removeAll( )方法。
调用retainAll( )方法可以将除了一组指定的元素之外的所有元素删除。
为了清空类集,可以调用clear( )方法。
通过调用contains( )方法,可以确定一个类集是否包含了一个指定的对象。
为了确定一个类集是否包含了另一个类集的全部元素,可以调用containsAll( )方法。
当一个类集是空的时候,可以通过调用isEmpty( )方法来予以确认。
调用size( )方法可以获得类集中当前元素的个数。
toArray( )方法返回一个数组,这个数组包含了存储在调用类集中的元素。这个方法比
它初看上去的能力要更重要。经常使用类数组语法来处理类集的内容是有优势的。通过在
类集和数组之间提供一条路径,可以充分利用这两者的优点。
调用equals( )方法可以比较两个类集是否相等。“相等”的精确含义可以不同于从类集
到类集。例如,可以执行equals( )方法以便用于比较存储在类集中的元素的值,换句话说,
equals( )方法能比较对元素的引用。
一个更加重要的方法是iterator( ),该方法对类集返回一个迭代程序。正如你将看到的
那样,当使用一个类集框架时,迭代程序对于成功的编程来说是至关重要的。


List接口:
List接口扩展了Collection并声明存储一系列元素的类集的特性。使用一个基于零的下
标,元素可以通过它们在列表中的位置被插入和访问。
List方法摘要:
对于由Collection定义的add( ) 和addAll( )方法,List增加了方法add(int, Object) 和
addAll(int, Collection)。这些方法在指定的下标处插入元素。
由Collection定义的add(Object)和addAll(Collection)的语义也被List改变了,以便它们在列表的尾部增加元素。
为了获得在指定位置存储的对象,可以用对象的下标调用get( )方法。
为了给类表中的一个元素赋值,可以调用set( )方法,指定被改变的对象的下标。
调用indexOf( )或lastIndexOf( )可以得到一个对象的下标。
通过调用subList( )方法,可以获得列表的一个指定了开始下标和结束下标的子列表。
正如你能想象到的,subList( )方法使得列表处理十分方便。

SortedSet接口:
SortedSet接口扩展了Set(Set扩展了Collection)并说明了按升序排列的集合的特性。除了那些由Set定义的方法之外,由SortedSet接口说明的方法列在表15-3中。当没有项包含在调用集合中时,其中的几种方法引发NoSuchElementException异常。当对象与调用集合中的元素不兼容时,引发ClassCastException 异常。如果试图使用null 对象, 而集合不允许null 时, 引发NullPointerException异常。


                                                                           Collection类
标准的Collection类总结如下:

AbstractCollection          实现大多数Collection接口
AbstractList                     扩展AbstractCollection并实现大多数List接口
AbstractSequentialList   为了被类集使用而扩展AbstractList,该类集使用连续而不是随机方
                                          式访问其元素
LinkedList                        通过扩展AbstractSequentialList来实现链接表
ArrayList                          通过扩展AbstractList来实现动态数组
AbstractSet                     扩展AbstractCollection并实现大多数Set接口
HashSet                           为了使用散列表而扩展AbstractSet
TreeSet                            实现存储在树中的一个集合。扩展AbstractSet


注意:除了Collection类外,还有几个从以前版本遗留下来的类,如Vector,Stack
和Hashtable均被重新设计成支持类集的形式。

ArrayList类:
ArrayList类扩展AbstractList并执行List接口。ArrayList支持可随需要而增长的动态数
组。在Java中,标准数组是定长的。在数组创建之后,它们不能被加长或缩短,这也就意
味着你必须事先知道数组可以容纳多少元素。但是,你直到运行时才能知道需要多大的数
组。为了解决这个问题,类集框架定义了ArrayList。本质上,ArrayList是对象引用的一个
变长数组。也就是说,ArrayList能够动态地增加或减小其大小。数组列表以一个原始大小
被创建。当超过了它的大小,类集自动增大。当对象被删除后,数组就可以缩小。
注意:动态数组也被从以前版本遗留下来的类Vector所支持。

ArrayList有如下的构造函数:
ArrayList( )                        其中第一个构造函数建立一个空的数组列表。
ArrayList(Collection c)     第二个构造函数建立一个数组列表,该数组列表由类集c中的元素初始化。
ArrayList(int capacity)     第三个构造函数建立一个数组列表,该数组有指定的初始容量(capacity)。容量是用于存储元素的基本数组的大小。当元素被追加到数组列表上时,容量会自动增加


HashSet类
HashSet扩展AbstractSet并且实现Set接口。它创建一个类集,该类集使用散列表进行存
储。正像大多数读者很可能知道的那样,散列表通过使用称之为散列法的机制来存储信息。
在散列(hashing)中,一个关键字的信息内容被用来确定唯一的一个值,称为散列码(hash
code)。而散列码被用来当做与关键字相连的数据的存储下标。关键字到其散列码的转换
是自动执行的——你看不到散列码本身。你的程序代码也不能直接索引散列表。散列法的
优点在于即使对于大的集合,它允许一些基本操作如add( ),contains( ),remove( )和size( )
方法的运行时间保持不变。
HashSet没有定义任何超过它的超类和接口提供的其他方法。
重要的是,注意散列集合并没有确保其元素的顺序,因为散列法的处理通常不让自己
参与创建排序集合。如果需要排序存储,另一种类集——TreeSet将是一个更好的选择。

TreeSet类
TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储。访问和检索
是很快的。在存储了大量的需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择。


                                                                    通过迭代函数访问类集

通常希望循环通过类集中的元素。例如,可能会希望显示每一个元素。到目前为止,
处理这个问题的最简单方法是使用iterator,iterator是一个或者实现Iterator或者实现
ListIterator接口的对象。Iterator可以完成循环通过类集,从而获得或删除元素。ListIterator
扩展Iterator,允许双向遍历列表,并可以修改单元。Iterator接口说明的方法总结在表15-4
中。ListIterator接口说明的方法总结在表15-5中。

由Iterator 定义的方法:
boolean hasNext( )          如果存在更多的元素,则返回true,否则返回false
Object next( )                    返回下一个元素。如果没有下一个元素,则引发NoSuchElementException异常
void remove( )                  删除当前元素,如果试图在调用next( )方法之后,调用remove( )方法,则引发 
                                           IllegalStateException异常

使用迭代函数
在通过迭代函数访问类集之前,必须得到一个迭代函数。每一个Collection类都提供一
个iterator( )函数,该函数返回一个对类集头的迭代函数。通过使用这个迭代函数对象,可
以访问类集中的每一个元素,一次一个元素。通常,使用迭代函数循环通过类集的内容,
步骤如下:
1. 通过调用类集的iterator( )方法获得对类集头的迭代函数。
2. 建立一个调用hasNext( )方法的循环,只要hasNext( )返回true,就进行循环迭代。
3. 在循环内部,通过调用next( )方法来得到每一个元素。
例程:// Demonstrate iterators.
import java.util.*;
class IteratorDemo {
public static void main(String args[]) {
// create an array list
ArrayList al = new ArrayList();
// add elements to the array list
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
// use iterator to display contents of al
System.out.print("Original contents of al: ");
Iterator itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}



                                                                         处 理 映 射
正如在本章开始时所谈到的,除了类集,Java 2还在java.util中增加了映射。映射(map)
是一个存储关键字和值的关联或者说是关键字/值对的对象。给定一个关键字,可以得到它
的值。关键字和值都是对象。关键字必须是唯一的。但值是可以被复制的。有些映射可以
接收null关键字和null值。而有的则不行。

映射接口
映射接口定义了映射的特征和本质。下面的接口支持映射:
Map                       映射唯一关键字给值
Map.Entry             描述映射中的元素(关键字/值对)。这是Map的一个内部类
SortedMap           扩展Map以便关键字按升序保持

由Map 定义的方法
void clear( )                                     从调用映射中删除所有的关键字/值对
boolean containsKey(Object k)    如果调用映射中包含了作为关键字的k,则返回true;否则返回false
boolean containsValue(Object v) 如果映射中包含了作为值的v,则返回true;否则返回false
Set entrySet( )                                 返回包含了映射中的项的集合(Set)。该集合包含了类型Map.Entry的对
                                                          象。这个方法为调用映射提供了一个集合“视图”
Boolean equals(Object obj)          如果obj是一个Map并包含相同的输入,则返回true;否则返回false
Object get(Object k)                        返回与关键字k相关联的值
int hashCode( )                              返回调用映射的散列码
boolean isEmpty( )                       如果调用映射是空的,则返回true;否则返回false
Set keySet( )                                 返回一个包含调用映射中关键字的集合(Set)。这个方法为调用映射的关
                                                        键字提供了一个集合“视图”
Object put(Object k, Object v)     将一个输入加入调用映射,覆盖原先与该关键字相关联的值。关键字和值分 
                                                       别为k和v。如果关键字已经不存在了,则返回null;否则,返回原先与关键字
                                                        相关联的值
void putAll(Map m)                        将所有来自m的输入加入调用映射
Object remove(Object k)                 删除关键字等于k的输入
int size( )                                          返回映射中关键字/值对的个数
Collection values( )                      返回一个包含了映射中的值的类集。这个方法为映射中的值提供了一个类集 
                                                      “视图”
映射循环使用两个基本操作:get( )和put( )。使用put( )方法可以将一个指定了关键字和
值的值加入映射。为了得到值,可以通过将关键字作为参数来调用get( )方法。调用返回该
值。

正如前面谈到的,映射不是类集,但可以获得映射的类集“视图”。为了实现这种功
能,可以使用entrySet( )方法,它返回一个包含了映射中元素的集合(Set)。

为了得到关键字的类集“视图”,可以使用keySet( )方法。
为了得到值的类集“视图”,可以使用values( )方法。类集“视图”是将映射集成到类集框架内的手段。


SortedMap 接口
SortedMap接口扩展了Map,它确保了各项按关键字升序排序。
由SortedMap 定义的方法:

Comparator comparator( )                 返回调用排序映射的比较函数。如果调用映射使用的是自然顺序
                                                              的话,则返回null
Object firstKey( )                                  返回调用映射的第一个关键字
SortedMap headMap(Object end)  返回一个排序映射,该映射包含了那些关键字小于end的映射输入
Object lastKey( )                                  返回调用映射的最后一个关键字
SortedMap subMap(Object start, Object end) 返回一个映射,该映射包含了那些关键字大于等于start
                                                                同时小于end的输入
SortedMap tailMap(Object start)        返回一个映射,该映射包含了那些关键字大于等于start的输入

排序映射允许对子映射(换句话说,就是映射的子集)进行高效的处理。使用
headMap( ),tailMap( )或subMap( )方法可以获得子映射。调用firstKey( )方法可以获得集合
的第一个关键字。而调用lastKey( )方法可以获得集合的最后一个关键字。

映射类:

有几个类提供了映射接口的实现。可以被用做映射的类总结如下:

AbstractMap       实现大多数的Map接口
HashMap             将AbstractMap扩展到使用散列表
TreeMap              将AbstractMap扩展到使用树
WeakHashMap  将AbstractMap扩展到使用弱关键字散列表

HashMap 类
HashMap类使用散列表实现Map接口。这允许一些基本操作如get( )和put( )的运行时间
保持恒定,即便对大型集合,也是这样的。
下面的构造函数定义为:
HashMap( )
HashMap(Map m)
HashMap(int capacity)
HashMap(int capacity, float fillRatio)
第一种形式构造一个默认的散列映射。第二种形式用m的元素初始化散列映射。第三
种形式将散列映射的容量初始化为capacity。第四种形式用它的参数同时初始化散列映射的
容量和填充比。容量和填充比的含义与前面介绍的HashSet中的容量和填充比相同。
HashMap实现Map并扩展AbstractMap。它本身并没有增加任何新的方法。
应该注意的是散列映射并不保证它的元素的顺序。因此,元素加入散列映射的顺序并不一定是它们被迭代函数读出的顺序。


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值