HashMap的containskey源码分析

HashMap作为util包中比较常用的一个数据结构,充分理解内部代码的逻辑是有很必要的,这里做一个对HashMapcontainsKey函数的源码分析笔记。

containsKey的代码如下:

 /** * Returns <tt>true</tt> if this map contains a mapping for the * specified key. * * @param key The key whose presence in this map is to be tested * @return <tt>true</tt> if this map contains a mapping for the specified * key. */
    public boolean containsKey(Object key) {
        return getEntry(key) != null;
    }

内部调用的是getEntry函数,进入getEntry函数:

/** * Returns the entry associated with the specified key in the * HashMap. Returns null if the HashMap contains no mapping * for the key. */
    final Entry<K,V> getEntry(Object key) {
        if (size == 0) {
            return null;
        }

        int hash = (key == null) ? 0 : hash(key);
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

可以看到主要的逻辑在:

if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;

而这里值得注意的是||前面的Object的==key.equals(k)key是一个Object,所以默认的equals方法为:

    public boolean equals(Object obj) {
        return (this == obj);
    }

所以要注意没有重写equals方法的Object作为HashMap``key的情况:
如数组作为key时,相同内容的key,但是属于不同的对象,比较的结果都为false

    原文作者:LiuConey
    原文地址: https://blog.csdn.net/LiuConey/article/details/50854199
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞