帮忙看看程序错误。有关HASHTABLE的自定义键类。

marcoleung 2004-07-02 12:55:10
程序意图:自定义一个类,用做哈斯表的键,该类重写了hashCode equals这两个方法,但编译不通过,并没得出预期结果。请各位帮忙看看,留意注释。

import java.util.*;
class Hashtest
{
public static void main(String args[])
{
Hashtable hs=new Hashtable();
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));


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("alber",33);
System.out.println((Integer)hs.get(m1));
//这句没得出预期结果,只得出null,但上面通过Enumeration接口就能迭代出所有的值。为什么这句这样写就不能得出相应的值?
}
}

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 (name.equals(obj.name) && age==obj.age)
//这句提示不能解释name age,但把上面的object换成Mykey就通过编译。为什么不能用父类呢?它不能动态找到NAME及AGE吗?
return true;
else
return false;

}

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


}
...全文
181 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
debug158 2004-11-20
  • 打赏
  • 举报
回复
ding
arkang168 2004-07-03
  • 打赏
  • 举报
回复
请问: minghuitian(明月)
注意,JAVA中是值传递,修改了值之后要从新加到HASH表中,否则修改无效.
----------------------------------------------------------------
java的对象是传值还是传址?
PageYi 2004-07-03
  • 打赏
  • 举报
回复
hastable不提倡用了,应该用hashmap(效率略高)
minghuitian 2004-07-03
  • 打赏
  • 举报
回复
注意,JAVA中是值传递,修改了值之后要从新加到HASH表中,否则修改无效.
marcoleung 2004-07-03
  • 打赏
  • 举报
回复
喔,明白了,谢谢编程菜鸟。这才是正确的答案。关键原来是在那句:
Mykey m1=new Mykey("alber",33);
这里所建的m1跟之前压入hashtable中的那一个键已经是不一样了。因为name是新的一对象了,因此String.hasCode也就跟原本的不一样了,这样的话就不能取得所要的值了,最后只能是null

PageYi 2004-07-03
  • 打赏
  • 举报
回复
顺便告诉你一下,你那种写法,在jdk1.5.0也可以得到你想要的结果
PageYi 2004-07-03
  • 打赏
  • 举报
回复
/*
* 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;
}
}
PageYi 2004-07-03
  • 打赏
  • 举报
回复
两次计算hashcode的值不一样,虽然name是相同的,但是两个不同的String对象,他们内存中的hashcode是不一样的
即return name.hashCode()+age;不同

你若这样先定义一个String= "alber";
你构造Mykey是传入这个参数,即可得到相同的字
marcoleung 2004-07-03
  • 打赏
  • 举报
回复
大家请注意,我的意图是将三对键对放到表里。
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。
现在的问题是,是不是不能这样写来取值,如果不能这样写要怎样写?为什么那样写?
marcoleung 2004-07-03
  • 打赏
  • 举报
回复
先不论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参数所引用的对象的内存地址一样?

另:请问明月
我什么时候修改了值?我的意图是想取回我指定的键所对应的值。
marcoleung 2004-07-03
  • 打赏
  • 举报
回复
你没有把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参数所引用的对象的内存地址一样?
AbeiXu 2004-07-02
  • 打赏
  • 举报
回复
呵呵,代码已经加上了:hs.put(new Mykey("alber",33),new Integer(2));

如dreamsheep(迷途的羊),问题就解决了:)
Tasia 2004-07-02
  • 打赏
  • 举报
回复
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));
dreamsheep 2004-07-02
  • 打赏
  • 举报
回复
父类不可以调用父类没有,子类才有的方法。
所谓,动态调用是指:子类重载父类的方法。父类调用该方法时,实际调用的是子类的方法。
dreamsheep 2004-07-02
  • 打赏
  • 举报
回复
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方法,都是先判断一下类型是否一致。只有一致时才比较。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧