最近断断续续的看李刚老师的《疯狂java讲义》,边看书边敲代码。发现了一个问题书上没有讲到。那就是标题所述。先引用书中的原话“HashMap、Hashtable判断两个value相等的标准更简单:只要两个对象通过equals()方法比较返回true即可。”我首先认为这个equals()方法是调用Map里的value对象的equals()方法。后来敲了如下的代码后觉得HashMap和Hashtable是有区别的。
例子代码如下:
class A{
int count;
public A( int c ){
this.count = c;
}
public boolean equals( Object b ){
if( b == this ){
return true;
}
if( b != null && b.getClass() == A.class )
{
A _b = (A)b;
return _b.count == this.count? true: false;
}
return false;
}
public int hashCode(){
return count;
}
}
class B{
int id ;
public B( int i )
{
id = i ;
}
public boolean equals( Object b ){
System.out.println( this.toString() );
return true;
}
}
class Test{
public static void Main(String[] args)
{
HashMap hmap = new HashMap();
hmap.put(new A(1234), "java 疯狂讲义");
hmap.put(new A(5678), "轻量级javaEE企业应用");
hmap.put(new A(7800), new B(3));
System.out.println(hmap);
System.out.println(hmap.containsValue(new B(4)));
System.out.println(hmap.containsValue(new B(5)));
}
}
HashMap的输出是:
{com.BookSamples.main.A@4d2=java 疯狂讲义, com.BookSamples.main.A@1e78=com.BookSamples.main.B@774085, com.BookSamples.main.A@162e=轻量级javaEE企业应用}
com.BookSamples.main.B@18f9dd6
true
com.BookSamples.main.B@ec6354
true
首先我输出了HashMap里所有的key-value,然后用B的子对象去判断集合里是否有这个value。可以发现equals()方法的调用的是传入containsValue的参数的,如果传入的不是B的对象那么结果返回的就不一定是true了(主要看你的value的equals方法怎么写的了,如果是字符串那么就返回false了)。
下面的是Hashtable的了:
public static void main( String[] args ) {
Hashtable hmap = new Hashtable();
hmap.put(new A(1234), "java 疯狂讲义");
hmap.put(new A(5678), "轻量级javaEE企业应用");
hmap.put(new A(7800), new B(3));
System.out.println(hmap);
System.out.println(hmap.containsValue(new B(4)));
System.out.println(hmap.containsValue(new B(5)));
}
结果是:
{com.BookSamples.main.A@162e=轻量级javaEE企业应用, com.BookSamples.main.A@4d2=java 疯狂讲义, com.BookSamples.main.A@1e78=com.BookSamples.main.B@1e25b76}
com.BookSamples.main.B@1e25b76
true
com.BookSamples.main.B@1e25b76
true
而Hashtable里调用的是集合里value的equals()方法。为了加强上文的描述,我查看了一下HashMap和Hashtable的containsValue的源码(只看懂了一丁点,源码看来现阶段不适合看啊)。
HashMap:
Hashtable:
哈哈,果然和上面说的一样。如果你想知道怎么在Eclipse里怎么设置就能看java源码的话,请看我的另一篇博客,这是我在网上搜集的方法然后记下防止忘了。