HashMap与Hashtable使用containsValue的区别

最近断断续续的看李刚老师的《疯狂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源码的话,请看我的另一篇博客,这是我在网上搜集的方法然后记下防止忘了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值