equals(Object obj){
   if(!(obj istanceof MyKey)){
      return false;
   }else if(name.equals(((MyKey)obj).name) && age == ((Mykey)obj).age) return true;
   else return flase;
}
基本上大部分java类的equals方法,都是先判断一下类型是否一致。只有一致时才比较。

解决方案 »

  1.   

    Mykey m1=new Mykey("alber",33);
    System.out.println((Integer)hs.get(m1));
                      //这句没得出预期结果,只得出null,但上面通过Enumeration接口就能迭代出所有的值。为什么这句这样写就不能得出相应的值?-----------------------------
    你没有把ml加入到hs中去,当然get 不到了。加一句:
    Mykey m1=new Mykey("alber",33);
                      hs.put(ml, new Integer(4));
    System.out.println((Integer)hs.get(m1));
      

  2.   

    呵呵,代码已经加上了:hs.put(new Mykey("alber",33),new Integer(2));如dreamsheep(迷途的羊),问题就解决了:)
      

  3.   

    你没有把ml加入到hs中去,当然get 不到了。加一句:
    Mykey m1=new Mykey("alber",33);
                      hs.put(ml, new Integer(4));
    System.out.println((Integer)hs.get(m1));
    --------------------------------------------------------------
    如你所说,在用GET的时候所使用的键参数是PUT的时候的对像引用?也就是说比较的时候是比较键对像引用对象内存地址是否跟GET参数所引用的对象的内存地址一样?
      

  4.   

    注意,JAVA中是值传递,修改了值之后要从新加到HASH表中,否则修改无效.
      

  5.   

    hastable不提倡用了,应该用hashmap(效率略高)
      

  6.   

    请问: minghuitian(明月) 
    注意,JAVA中是值传递,修改了值之后要从新加到HASH表中,否则修改无效.
    ----------------------------------------------------------------
    java的对象是传值还是传址?
      

  7.   

    先不论hashtable好还是hastmap好,先把我这个问题解决了再说。你没有把ml加入到hs中去,当然get 不到了。加一句:
    Mykey m1=new Mykey("alber",33);
                      hs.put(ml, new Integer(4));
    System.out.println((Integer)hs.get(m1));
    --------------------------------------------------------------
    请问非典型:
    如你所说,在用GET的时候所使用的键参数是PUT的时候的对像引用?也就是说比较的时候是比较键对像引用对象内存地址是否跟GET参数所引用的对象的内存地址一样?另:请问明月
    我什么时候修改了值?我的意图是想取回我指定的键所对应的值。
      

  8.   

    大家请注意,我的意图是将三对键对放到表里。
    hs.put(new Mykey("joe",12),new Integer(1));
    hs.put(new Mykey("alber",33),new Integer(2));
    hs.put(new Mykey("bush",24),new Integer(3));然后想通过语句
    Mykey m1=new Mykey("alber",33);
    System.out.println((Integer)hs.get(m1));
    取回name是alber年龄是33的键所对应的值,也就是2。现在的情况是得不到预期的值,而是得到了NULL。
    现在的问题是,是不是不能这样写来取值,如果不能这样写要怎样写?为什么那样写?
      

  9.   

    两次计算hashcode的值不一样,虽然name是相同的,但是两个不同的String对象,他们内存中的hashcode是不一样的   
    即return name.hashCode()+age;不同你若这样先定义一个String= "alber";
    你构造Mykey是传入这个参数,即可得到相同的字
      

  10.   

    /*
     * Created on 2004-7-3
     *
     * TODO To change the template for this generated file go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    package e20040702;import java.util.*;
    /**
     * @author Administrator
     *
     * TODO To change the template for this generated type comment go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    public class Hashtest
    {
    public static void main(String args[])
    {
    String name=new String("alber");
    Hashtable hs=new Hashtable();
    hs.put(new Mykey("joe",12),new Integer(1));
    hs.put(new Mykey(name,33),new Integer(2));
    hs.put(new Mykey("bush",24),new Integer(3));


    Enumeration e=hs.keys();
    while (e.hasMoreElements())
    {
    Mykey m=(Mykey)e.nextElement();
    System.out.print(m.toString()+"=");
    System.out.println((Integer)hs.get(m));

    }
    Mykey m1=new Mykey(name,33);
    System.out.println((Integer)hs.get(m1));
    }
    }class Mykey
    {
    private String name;
    private int age;

    public Mykey(String name,int age)
    {
    this.name=name;
    this.age=age;
    }

    public String toString()
    {
    return new String(name+", "+age);
    }

    public boolean equals(Object obj)
    {
    if(!(obj instanceof Mykey))
        return false;
    else if(name.equals(((Mykey)obj).name) && age == ((Mykey)obj).age) 
    return true;
    else 
    return false;
    }

    public int hashCode()
    {
    return name.hashCode()+age;
    }
    }
      

  11.   

    顺便告诉你一下,你那种写法,在jdk1.5.0也可以得到你想要的结果
      

  12.   

    喔,明白了,谢谢编程菜鸟。这才是正确的答案。关键原来是在那句:
    Mykey m1=new Mykey("alber",33);
    这里所建的m1跟之前压入hashtable中的那一个键已经是不一样了。因为name是新的一对象了,因此String.hasCode也就跟原本的不一样了,这样的话就不能取得所要的值了,最后只能是null