13.1 Java.util
(1) 聚集
BitSet:动态可变的位向量。
Enumeration:一个接口,返回的对象枚举了一个值的集合。
Vector:动态可变的Object向量。
Stack:在Vector中加进后进先出方法后的扩展。
Dictionary:抽象类,完成关键字到值的算法。
Hashtable:用哈希码实现Dictionary
Properties:Hashtable扩展,其键和值都是String型。
(2) 设计模式
Observer/Observable:这一对接口/类使得一个对象成为Observable,做法是当在一个Observable对 象中发生某感兴趣的事件时,一个或多个Observer对象被通知到。
(3) 杂项
Date: 以秒为最小计数单位的时间、日期。
Random:可产生伪随机数序列的对象。
StringTokenizer:据界限符将字符串分解为Token。
13.2 BitSet
(1) BitSet类
大小可动态改变, 取值为true或false的位集合。用于表示一组布尔标志。
存储的大小只要保证能索引。超出有效范围就认为fasle。
(2) 构造函数: BitSet() or BitSet(int nbits)
(3) 方法
public void set(int pos): 位置pos的字位设置为true。
public void clear(int pos): 位置pos的字位设置为false。
public boolean get(int pos): 返回位置是pos的字位值。
public void and(BitSet other): other同该字位集进行与操作,结果作为该字位集的新值。
public void or(BitSet other): other同该字位集进行或操作,结果作为该字位集的新值。
public void xor(BitSet other): other同该字位集进行异或操作,结果作为该字位集的新值。
public int size(): 在不增加集合容量前提下,返回可被设置或清除的最高的字位序号。
public int hashCode(): 返回该集合Hash 码, 这个码同集合中的字位值有关。
public boolean equals(Object other): 如果other中的字位同集合中的字位相同,返回true。
(4) 例1:标明一个字符串中用了哪些字符
public class WhichChars{
private BitSet used = new BitSet();
public WhichChars(String str){
for(int i=0;i<str.lenth();i++)
used.set(str.charAt(i));// set bit for char
}
public String toString(){
String desc="[";
int size=used.size();
for(int i=0;i<size;i++){
if(used.get(i))
desc+=(char)i;
}
return desc+"]";
}
};
例2:筛选法求素数
BitSet sieve=new BitSet(1024);
int size=sieve.size();
for (int i=0;i<size;i++) sieve.set(i);
int finalBit = (int)Math.sqrt(sieve.size());
for (int i=2; i<finalBit;i++)
if (sieve.get(i))
for (int j=2*i;j<size;j+=i)
sieve.clear(j);
13.3 Enumeration接口/ StringTokenizer
13.3.1 Enumeration
(1) 方法
public abstract boolean hasMoreElements():不空返回true,
public abstratObject nextElement(): 返回下一个元素。若枚举已空,则引发NoSuchElementException。
(2) 例子
import java.util.Enumeration;
class Enum implements Enumeration {
private int count = 0;
private boolean more = true;
public boolean hasMoreElements() {
return more;
}
public Object nextElement() {
count++;
if(count >4 ) more = false;
return new Integer(count);
}
}
Enumeration enum = new Enum();
while (enum.hasMoreElements())
System.out.println(enum.nexElement());
13.4.2 StringTokenizer
(1) Constructors
public StringTokenizer(String str,String delim,boolean returnTokens)
对字符串str构作一个StringTokenizer, delim中字符作界限符。returnTokens是将界限符作为标记返回还是跳过,若作为标记返回,则每个界限符单独返回。
public StringTokenizer(String str,String delim)
等效与StringTokenizer(str,delim,false),即界限符不返回。
public StringTokenizer(String str)
等效于StringTokenizer(str," \t\n\r"),即空格符作为界限符。
(2) Methods
public boolean hasMoreTokens(): 若还有标记,返回true。
public String nextToken()
返回串中下个标记。若无,则引发NoSuchElementException.
public String nextToken(String delim)
将界限符集改为delim中字符并返回下个标记。注意没有只设新的界限集而不返回下一个标记的方法。
public int countTokens()
以当前界限集进行分解时字符串中还剩下的标记数。
(3) 例1: 用空格和逗号来分隔字符串:
String str = "Gone,and forgotten";
StringTokenizer tokens = new StringTokenizer(str," ,");
while(token.hasMoreTokens())
System.out.println(token.nextToken());
(4) 例2: 分析name=value
import java.util.StringTokenizer;
class STDemo {
static String in = *title=java: author=Xu:*+
*email=xudx@nju*;
public static void main(String args[]){
StringTokenizer st= new StringTokenizer(in,*= :*);
while (st.hasMoreTokens()) {
String key = st.nextToken();
String value = st.nextToken();
System.out.println(key+*\t*+value);
}
}
}
若要功能更强的机制来分解字符串, 可用StreamTokenizer。先用字符串创建一个StringBufferInputStream对象。
Vector and Stack
13.4.1 Vector: 大小可变的Object数组,存取, 加入或删除,
(1) 构造函数
public Vector(int initialCapacity,int capacityIncrement)
创建一个空向量(初始容量, 容量增量)
public Vector(int initialCapacity): Vector(initialCapacity,0)
public Vector(): 以缺省初始容量建立空向量,容量增量为0。
(2) 域
protected Object elementData[]: 存储元素的缓冲区。
protected int elementCount: 当前缓冲区中的元素个数。
protected int capacityIncrement:当elementData用完时增加的元素个数,为0则每次容量增倍。
(3) 修改
public final synchronized void setElementAt(Object obj, int index): 将obj放在index处。
public final synchronized void removeElementAt(int index)
将index处的元素删去,index后元素前移,大小减1。
public final synchronized void insertElementAt(Object obj, int index) : 将obj插在index处,向量中index后元素后移。
public final synchronized void addElement(Object obj)
将obj放在向量的尾上。
public final synchronized boolean removeElement(Object obj)
先找Obj, 调用removeElementAt,or 返回false。
public final synchronized void removeAllElements()
删除向量中所有元素,即变为空。
Example
import java.util.Vector;
public class Polygon{ // 存储多边形顶点的Point表
private Vector verties = new Vector();
public void add(Point p){
verties.addElement(p);
}
public void remove(Point p){
verties.removeElement(p);
}
public int numVerties(){
return verties.size();
}
// ..其它方法....
}
(4) 检测
查找方法都用到Object.equals. 若index 无效,异常。
public finalsynchronized Object elementAt(int index)
public final boolean contains(Object obj): 在向量中返回true。
public final synchronized int indexOf(Object obj ,int index)
从index开始,返回obj第一次出现的序号。若不存在返回-1。
public finalint indexOf(Object obj): =indexOf(obj,0)。
public final synchronized int lastIndexOf(Object obj ,int index)
反向搜索,返回obj第一次出现序号。若不存在,返回-1。
public final int lastIndexOf(Object obj): =lastIndexOf(obj , 0)。
public final synchronized void copyInfo(Object[] anArray)
将向量中的元素拷贝到指定的数组中
public final synchronized Enumeration element()
返回当前元素表的Enumeration。
public final synchronized Object firstElement()
返回向量的第一个元素,若向量为空,引发异常。
public final synchronized Object lastElement()
返回最后一个元素,若向量为空,引发异常。firstElement和lastElement这对方法能用来循环遍历向量中的元素。
(5) 容量管理
public final int size(): 返回当前向量中元素个数。
public final boolean isEmpty(): 向量为空返回true。
public final synchronized void trimToSize()
将向量的容量置为当前它含有的元素个数, 在元素个数稳定不变时可用它来减少向量的存储空间。以后需要时仍可增加。
public final synchronized void setSize(int newSize)
将向量的大小置为newSize,若为减少,则尾上超过的部分被丢弃,若增加则新元素置null。
public final int capacity()
返回当前容量。即不增加新元素时, 能容纳的元素个数。
pub final synchronized void ensureCapacity(int minCapacity): 在需增加容量时,保证至少minCapacity。
(6) 例子:使Polygon能包含另一个多边形的顶点的方法
public void merge(Polygon other){
int otherSize = other.vertices.size();
vertices.ensureCapacity(vertices.size()+otherSize);
for(int i=0;i<otherSize;i++)
vertices.addElement(other.vertices.elementAt(i));
}