import java.util.*;
import java.io.*;public class Test
{
public static void main(String[] args)
{
Hashtable hash=new Hashtable();
int[] a=new int[2];
a[0]=1;
a[1]=2;
table t1=new table(a);
table t2=new table(a);
hash.put(t1, "OK");
if(hash.get(t2)==null)
System.out.println("No");
else
System.out.println("Yes");
}
}class table implements Serializable
{
int[] a;
table(int[] _b)
{
a=new int[_b.length];
for(int i=0;i<a.length;i++)
a[i]=_b[i];
}
public boolean equals(table t)
{
if ((t == null) || !(t.getClass().equals(this.getClass()))) {
return false;
}
if(!(a.length==t.a.length))
return false;
for(int i=0;i<a.length;i++)
{
if(a[i]!=t.a[i])
return false;
}
return true;
}
public int hashCode()
{
int sum=0;
for(int i=0;i<a.length;i++)
sum=10*sum+a[i];
return sum;
}
}以上的代码, 我就是想把table类型变量放入到hashtable中,但是以上代码的输出为什么是No,而不是我想要得Yes呢?请问怎样才能得到Yes的结果
import java.io.*;public class Test
{
public static void main(String[] args)
{
Hashtable hash=new Hashtable();
int[] a=new int[2];
a[0]=1;
a[1]=2;
table t1=new table(a);
table t2=new table(a);
hash.put(t1, "OK");
if(hash.get(t2)==null)
System.out.println("No");
else
System.out.println("Yes");
}
}class table implements Serializable
{
int[] a;
table(int[] _b)
{
a=new int[_b.length];
for(int i=0;i<a.length;i++)
a[i]=_b[i];
}
public boolean equals(table t)
{
if ((t == null) || !(t.getClass().equals(this.getClass()))) {
return false;
}
if(!(a.length==t.a.length))
return false;
for(int i=0;i<a.length;i++)
{
if(a[i]!=t.a[i])
return false;
}
return true;
}
public int hashCode()
{
int sum=0;
for(int i=0;i<a.length;i++)
sum=10*sum+a[i];
return sum;
}
}以上的代码, 我就是想把table类型变量放入到hashtable中,但是以上代码的输出为什么是No,而不是我想要得Yes呢?请问怎样才能得到Yes的结果
{
Hashtable hash=new Hashtable();int[] a=new int[2];
a[0]=1;
a[1]=2;
table t1=new table(a);
table t2=new table(a);
hash.put(t1, "OK");
if(hash.get(t2)==null)
System.out.println("No");
else
System.out.println("Yes");
}
}
------------------------
你本来就没有在Hashtable表里面存入key值等于t2的值,所以你
if(hash.get(t2)==null)用这个方法去取key等于t2的值的时候总是返回null..
既然你都知道hash.put(t1, "OK");t2就不知道怎么赋值了吗?
你改成if(hash.get(t1)==null)这肯定可以输出Yes。。
好像这是个比较普遍的问题了, 很多人都犯过类似的错误, 正确的方法如下:
public boolean equals(Object t) //这里的Object而不是table
{
if ((t == null) || !(t.getClass().equals(this.getClass()))) {
return false;
}
table temp = (table) t; /////////这里需要转换
if(!(a.length==temp.a.length))
return false;
for(int i=0;i<a.length;i++)
{
if(a[i]!=temp.a[i])
return false;
}
return true;
}
你的方法public boolean equals(table t) 其实并没有覆盖掉超类(Object)的equals方法, 而是重载了这个方法.
当你调用t1.equals(t2)时, 它确实会返回true.
那为什么到了Hashtable里面就不行了呢? 关键在于Hashtable的put()方法接受的是Object类型,所以你的t1进去以后,是被当作Object来保存的, 等到你后面使用if(hash.get(t2)==null)的时候, Hashtable会调用equals方法判断两个key是否相等, 而它调用的恰恰是Object的equals方法而不是你所实现的那个equals方法.
Object的equals方法判断的是两个对象是否是同一个对象, 所以当然返回false, 也就得到"NO"了.