对应第8章
数组的初始化:
// 先对总体new,再对每个元素new Weeb[] b=new Weeb[4]; for(int i=0;i<b.length;i++) b[i]=new Weeb();选择数组还是集合? 数组查找效率高,但是集合灵活,易于扩展。
数组可以作为函数返回值。
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介绍 见下一节
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)) 。。。。。。