Thinking in Java笔记7

    技术2022-05-20  56

    (第8章笔记)

    //集合可以用来容纳对象,但不能容纳基本数据类型,但可以容纳Integer,Double等 package com; import java.util.*; class Weeble{ void display(){ System.out.println("Weeble"); } } class Cat{ private int catNumber; Cat(int i){ catNumber = i; } void print(){ System.out.println("Cat #" + catNumber); } public String toString(){ //对Object对象中的toString方法覆盖 return "This is Cat #" + catNumber; } //覆盖Object的两个方法 public int hashCode(){ //hashCode()为每个对象生成散列值,默认情况下取对象的地址 return catNumber; //所以,如果有两个Cat(3)的话两者的散列值并不相同 } public boolean equals(Object o){ //当散列表试图判断键值是否等于表内的某个键时,就会用到这个方法 //前半段判断o是否为Cat类的一个实例 return (o instanceof Cat)&&(catNumber == ((Cat)o).catNumber); } } class Dog{ private int dogNumber; Dog(int i){ dogNumber = i; } void print(){ System.out.println("Dog #" + dogNumber); } public String toString(){ return "This is Dog #" + dogNumber; } } //一个用Vector实现的简单的Hashtable类 //AssocArray必须覆盖Dictionary的所有方法,因为除构建器外都是抽象的 class AssocArray extends Dictionary { private Vector keys = new Vector(); private Vector values = new Vector(); public int size() { return keys.size(); } public boolean isEmpty() { return keys.isEmpty(); } public Object put(Object key, Object value) { keys.addElement(key); values.addElement(value); return key; } public Object get(Object key) { int index = keys.indexOf(key); // indexOf() Returns -1 if key not found: if(index == -1) return null; return values.elementAt(index); } public Object remove(Object key) { int index = keys.indexOf(key); if(index == -1) return null; keys.removeElementAt(index); Object returnval = values.elementAt(index); values.removeElementAt(index); return returnval; } public Enumeration keys() { return keys.elements(); } public Enumeration elements() { return values.elements(); } } public class Test7 { /** * @param args */ public String toString(){ return "Test7 address: " + super.toString() + "/n"; //获取当前地址不能使用this,否则会不断递归调用toString,造成溢出 } public static void main(String[] args) { // TODO Auto-generated method stub Weeble[] a = new Weeble[2]; System.out.println("a.length()=" + a.length); //编译器禁止对null句柄进行操作 a[1] = new Weeble(); a[1].display(); //在初始化a[1]之前是不能操作a[1]的,尽管编译器不会报错,但运行会出错 int[] b = {1,2}; int[] c; c = b; c[0] = 0; System.out.println("c[0] = " + c[0]); System.out.println("c[1] = " + c[1]); c = new int[] {9,8}; //重新定义句柄c的指向 System.out.println("after being redefined"); System.out.println("c[0] = " + c[0]); System.out.println("c[1] = " + c[1]); Vector vec = new Vector(); //此Vector对象可以容纳任意对象 vec.addElement(new Cat(1)); vec.addElement(new Dog(1)); ((Cat)vec.elementAt(0)).print(); //运行时需要类型转换 //((Dog)vec.elementAt(1)).print(); 程序会在运行时检查vec中的类型,此处会报错,Dog对象不能转换成Cat ((Dog)vec.elementAt(1)).print(); System.out.println(new Cat(2)); //println()期望的是一个String类型,其实不然,这时编译器默认调用Cat类的toString()方法 //只有String才能得到这样的结果,其他类型不会进行这样的转换 //可以给Vector指定所能接受的类型,通过参数 Vector<Integer> vec_int = new Vector<Integer>(); //Java中的反复器(iterator)——Enumeration //Enumeration的作用见下 Vector vec2 = new Vector(); vec2.addElement(new Cat(3)); vec2.addElement(new Cat(4)); Enumeration e = vec2.elements(); while(e.hasMoreElements()) ((Cat)e.nextElement()).print(); Test7 t7 = new Test7(); Vector vec3 = new Vector(); vec3.addElement(t7); System.out.println(vec3); //获取t7的地址,见Test7类方法toString() BitSet bs1 = new BitSet(); bs1.set(127); System.out.println(bs1); Hashtable ht = new Hashtable(); for(int i=0;i<10;i++) ht.put(new Cat(i), new Dog(i)); System.out.println("Looking up Dog for Cat #3"); Cat cat = new Cat(3); if(ht.containsKey(cat)) //如果上面的Cat类里没有覆盖hashCode()和equals()两个方法 System.out.println((Dog)ht.get(cat)); //仅仅这样写的话是达不到预期的效果的,原因见上 else System.out.println("There is no Cat #3"); } } //Enumeration仅能做下面三件事: //(1) 用一个名为 elements()的方法要求集合为我们提供一个Enumeration。我们首次调用它的nextElement()时, // 这个Enumeration 会返回序列中的第一个元素。 //(2) 用nextElement()获得下一个对象。 //(3) 用hasMoreElements()检查序列中是否还有更多的对象。 //Java集合类型:Vector,BitSet,Stack,Hashtable //Vector操作亦可针对Stack 对象进行。这可能是由继承的特质决定的——Stack“属于”一种Vector。 //因此,能对Vector 进行的操作亦可针对Stack 进行,例如 elementAt()方法。

     

    运行结果:

     

    a.length()=2Weeblec[0] = 0c[1] = 2after being redefinedc[0] = 9c[1] = 8Cat #1Dog #1This is Cat #2Cat #3Cat #4[Test7 address: com.Test7@61de33]{127}Looking up Dog for Cat #3This is Dog #3


    最新回复(0)