8、对象的容纳

对应第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))
    。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值