对应第8章
1、数组
数组的初始化:
// 先对总体new,再对每个元素new
Weeb[] b=new Weeb[4];
for(int i=0;i<b.length;i++)
b[i]=new Weeb();
选择数组还是集合?
数组查找效率高,但是集合灵活,易于扩展。
数组可以作为函数返回值。
2、枚举类型(反复器)
Enumeration的对象实质是一个容器。
枚举中只有两种方法,比如
Enumeration e
e.hasMoreElements() // 判断枚举中是否还有剩余元素
e.nextElement() // 枚举中下一个元素
怎样得到枚举类型?
其中可以由Vector的elements()方法得到,也可由Hashtable得到,例:
Vector v=new Vector();
for(int i=0;i<3;i++)
v.addElement(new Ham(i));
// 将Vector中所有元素都赋值到枚举中
Enumeration e=v.elements();
Hashtable ht=new Hashtable();
Enumeration e2=ht.elements();
8.1 enum介绍 见下一节
3、集合
java提供四种类型的集合类:Vector(矢量)、Bitset(位集)、Stack(堆栈)、Hashtable(散列表)
(1)Vector
Vector是特殊的数组,每个元素都有自己的序号。查找是顺序查找,效率不高。
Vector v=new Vector();
v.addElement(new Ham(i));
v.elementAt(i) // 求Vector中第几个元素
v.size()
v.isEmpty()
// 查找对象key在Vector中的下标
int index=v.indexOf(key);
// 删除某下标处的元素
v.removeElementAt(index);
// 将Vector中所有元素都赋值到枚举中
Enumeration e=v.elements();
(2)BitSet 略
(3) Stack
栈,后入先出
方法有:
// 初始化
Stack s1=new Stack();
Stack<String> s2 = new Stack<String>();
s1.push();
s1.pop();
s1.empty()
因为Stack是Vector的子类,所以Stack也有Vector的方法,比如
s1.addElement();
s1.elementAt(i)
例子:
enum Month { JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE,
JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER }
Stack<String> stack = new Stack<String>();
for(Month m : Month.values())
stack.push(m.toString());
print("stack = " + stack);
// Treating a stack as a Vector:
stack.addElement("The last line");
print("element 5 = " + stack.elementAt(5));
while(!stack.empty())
printnb(stack.pop() + " ");
(4) Hashtable
先介绍Dictionary类(见8.2节),该类中可以存储【键/值】】对,但是该类过时了。
标准java库只包含了Dictionary的一个子类,就是Hashtable(散列表),所以哈希表存储的也是【键/值】】对。
Dictionary的方法就是Hashtable的方法
Hashtable优点是查找快!!
Hashtable可以转化为Enumeration:
Hashtable ht=new Hashtable();
Enumeration e2=ht.elements();
// 一个哈希表例子:统计0-20间随机整数真正出现次数
import java.util.*;
class Counter{
int i=1;
public String toString(){
return Integer.toString(i);
}
}
public class HashtableTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Hashtable ht=new Hashtable();
for(int i=0;i<10000;i++)
{
Integer key=new Integer((int)Math.random()*20);
if(ht.containsKey(key))
((Counter)ht.get(key)).i++;
else
ht.put(key, new Counter());
}
System.out.println(ht);
}
}
思考:看某【键/值】】是否存在于Hashtable中比较的是key值,那么如果key不是普通的Integer之类的,比较就不好比较了。如果某个类A打算用作key,则A中最好自己定义hashCode()和equals()方法。
// Groundhog.java
public class Groundhog {
private int number;
public Groundhog(int n) { number = n; }
public String toString() {
return "Groundhog #" + number;
}
// 重要方法
public int hashCode() { return number; }
public boolean equals(Object o) {
// 检查对象是否为null,检查对象是否为Groundhog的一个实例
return o instanceof Groundhog &&
(number == ((Groundhog)o).number);
}
}
// Prediction.java
public class Prediction {
private static Random rand = new Random(47);
private boolean shadow = rand.nextDouble() > 0.5;
public String toString() {
if(shadow)
return "Six more weeks of Winter!";
else
return "Early Spring!";
}
}
Hashtable ht=new Hashtable();
for(int i=0;i<10;i++)
ht.put(new Groundhog(i), new Prediction());
Groundhog test=new Groundhog(3);
if(ht.containsKey(test))
。。。。。。