15.3.3 hashset类
hashset扩展abstractset并且实现set接口。它创建一个类集,该类集使用散列表进行存储。正像大多数读者很可能知道的那样,散列表通过使用称之为散列法的机制来存储信息。在散列(hashing)中,一个关键字的信息内容被用来确定唯一的一个值,称为散列码(hashcode)。而散列码被用来当做与关键字相连的数据的存储下标。关键字到其散列码的转换是自动执行的??你看不到散列码本身。你的程序代码也不能直接索引散列表。散列法的优点在于即使对于大的集合,它允许一些基本操作如add( ),contains( ),remove( )和size( )方法的运行时间保持不变。
下面的构造函数定义为:
hashset( )
hashset(collection c)
hashset(int capacity)
hashset(int capacity, float fillratio)
第一种形式构造一个默认的散列集合。第二种形式用c中的元素初始化散列集合。第三种形式用capacity初始化散列集合的容量。第四种形式用它的参数初始化散列集合的容量和填充比(也称为加载容量)。填充比必须介于0.0与1.0之间,它决定在散列集合向上调整大小之前,有多少能被充满。具体的说,就是当元素的个数大于散列集合容量乘以它的填充比时,散列集合被扩大。对于没有获得填充比的构造函数,默认使用0.75.
hashset没有定义任何超过它的超类和接口提供的其他方法。
重要的是,注意散列集合并没有确保其元素的顺序,因为散列法的处理通常不让自己参与创建排序集合。如果需要排序存储,另一种类集??treeset将是一个更好的选择。
这里是一个说明hashset的例子。
// demonstrate hashset.
import java.util.*;
class hashsetdemo {
public static void main(string args[]) {
// create a hash set
hashset hs = new hashset();
// add elements to the hash set
hs.add("b");
hs.add("a");
hs.add("d");
hs.add("e");
hs.add("c");
hs.add("f");
system.out.println(hs);
}
}
下面是该程序的输出:
[a, f, e, d, c, b]
如上面解释的那样,元素并没有按顺序进行存储。
15.3.4 treeset类
treeset为使用树来进行存储的set接口提供了一个工具,对象按升序存储。访问和检索是很快的。在存储了大量的需要进行快速检索的排序信息的情况下,treeset是一个很好的选择。
下面的构造函数定义为:
treeset( )
treeset(collection c)
treeset(comparator comp)
treeset(sortedset ss)
第一种形式构造一个空的树集合,该树集合将根据其元素的自然顺序按升序排序。第二种形式构造一个包含了c的元素的树集合。第三种形式构造一个空的树集合,它按照由comp指定的比较函数进行排序(比较函数将在本章后面介绍)。第四种形式构造一个包含了ss的元素的树集合
这里是一个说明treeset的例子。
// demonstrate treeset.
import java.util.*;
class treesetdemo {
public static void main(string args[]) {
// create a tree set
treeset ts = new treeset();
// add elements to the tree set
ts.add("c");
ts.add("a");
ts.add("b");
ts.add("e");
ts.add("f");
ts.add("d");
system.out.println(ts);
}
}
这个程序的输出如下所示:
[a, b, c, d, e, f]
正如上面解释的那样,因为treeset按树存储其元素,它们被按照排序次序自动安排,如程序输出所示。
15.4 通过迭代函数访问类集
通常希望循环通过类集中的元素。例如,可能会希望显示每一个元素。到目前为止,处理这个问题的最简单方法是使用iterator,iterator是一个或者实现iterator或者实现listiterator接口的对象。iterator可以完成循环通过类集,从而获得或删除元素。listiterator扩展iterator,允许双向遍历列表,并可以修改单元。iterator接口说明的方法总结在表15-4中。listiterator接口说明的方法总结在表15-5中。
表15-4 由iterator 定义的方法
方法描述
boolean hasnext( ) 如果存在更多的元素,则返回true,否则返回false object next( ) 返回下一个元素。如果没有下一个元素,则引发nosuchelementexception异常
void remove( ) 删除当前元素,如果试图在调用next( )方法之后,调用remove( )方法,则引发illegalstateexception异常
表15-5 由listiterator 定义的方法
方法描述
void add(object obj) 将obj插入列表中的一个元素之前,该元素在下一次调用next( )方法时,被返回
boolean hasnext( ) 如果存在下一个元素,则返回true;否则返回falseboolean hasprevious( ) 如果存在前一个元素,则返回true;否则返回falseobject next( ) 返回下一个元素,如果不存在下一个元素,则引发一个nosuchelementexception异常
int nextindex( ) 返回下一个元素的下标,如果不存在下一个元素,则返回列表的大小object previous( ) 返回前一个元素,如果前一个元素不存在,则引发一个nosuchelementexception异常
int previousindex( ) 返回前一个元素的下标,如果前一个元素不存在,则返回-1void remove( ) 从列表中删除当前元素。如果remove( )方法在next( )方法或previous( )方法调用之前被调用,则引发一个illegalstateexception异常
void set(object obj) 将obj赋给当前元素。这是上一次调用next( )方法或previous( )方法最后返回的元素
15.4.1 使用迭代函数
在通过迭代函数访问类集之前,必须得到一个迭代函数。每一个collection类都提供一个iterator( )函数,该函数返回一个对类集头的迭代函数。通过使用这个迭代函数对象,可以访问类集中的每一个元素,一次一个元素。通常,使用迭代函数循环通过类集的内容,
步骤如下:
1. 通过调用类集的iterator( )方法获得对类集头的迭代函数。
2. 建立一个调用hasnext( )方法的循环,只要hasnext( )返回true,就进行循环迭代。
3. 在循环内部,通过调用next( )方法来得到每一个元素。
对于执行list的类集,也可以通过调用listiterator来获得迭代函数。正如上面解释的那样,列表迭代函数提供了前向或后向访问类集的能力,并可让你修改元素。否则,listiterator如同iterator功能一样。
这里是一个实现这些步骤的例子,说明了iterator和listiterator.它使用arraylist对象,但是总的原则适用于任何类型的类集。当然,listiterator只适用于那些实现list接口的类集。
// 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 + " ");
}
system.out.println();
// modify objects being iterated
listiterator litr = al.listiterator();
while(litr.hasnext()) {
object element = litr.next();
litr.set(element + "+");
}
system.out.print("modified contents of al: ");
itr = al.iterator();
while(itr.hasnext()) {
object element = itr.next();
system.out.print(element + " ");
}
system.out.println();
314 第2 部分java 库
// now, display the list backwards
system.out.print("modified list backwards: ");
while(litr.hasprevious()) {
object element = litr.previous();
system.out.print(element + " ");
}
system.out.println();
}
}
程序的输出如下所示:
original contents of al: c a e b
闽公网安备 35060202000074号