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的结果

解决方案 »

  1.   

    根据你Table类的equal方法判断你所定义的两个Table对象并不相等,所以输出的肯定NO了。
      

  2.   

    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");
    }
    }
    ------------------------
    你本来就没有在Hashtable表里面存入key值等于t2的值,所以你
    if(hash.get(t2)==null)用这个方法去取key等于t2的值的时候总是返回null..
    既然你都知道hash.put(t1, "OK");t2就不知道怎么赋值了吗?
    你改成if(hash.get(t1)==null)这肯定可以输出Yes。。
      

  3.   

    这个问题主要是因为楼主实现table类的equals方法有误!
    好像这是个比较普遍的问题了, 很多人都犯过类似的错误, 正确的方法如下:
    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;
    }
      

  4.   

    补充说明下:
    你的方法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"了.