`
liu0107613
  • 浏览: 74087 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

java中HashCode的作用和Map的实现结构

    博客分类:
  • java
阅读更多

Map 是一种数据结构,用来实现key和value 的映射。通过Key可以找到Value。实现类包括

HashMap,LinkedHashMap,TreeMap

 

 

    /**
     * Applies a supplemental hash function to a given hashCode, which
     * defends against poor quality hash functions.  This is critical
     * because HashMap uses power-of-two length hash tables, that
     * otherwise encounter collisions for hashCodes that do not differ
     * in lower bits. Note: Null keys always map to hash 0, thus index 0.
     */
    static int hash(int h) {
        // This function ensures that hashCodes that differ only by
        // constant multiples at each bit position have a bounded
        // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }

 

 

    /**
     * Returns index for hash code h.
     */
    static int indexFor(int h, int length) {
        return h & (length-1);
    }

 

    /**
     * Associates the specified value with the specified key in this map.
     * If the map previously contained a mapping for the key, the old
     * value is replaced.
     *
     * @param key key with which the specified value is to be associated
     * @param value value to be associated with the specified key
     * @return the previous value associated with <tt>key</tt>, or
     *         <tt>null</tt> if there was no mapping for <tt>key</tt>.
     *         (A <tt>null</tt> return can also indicate that the map
     *         previously associated <tt>null</tt> with <tt>key</tt>.)
     */
    public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

 

 

HashMap 是以数组的结构,用哈希函数值跟数组的长度做位与运算,获取对应数组的索引。浏览key值时,不保证顺序。
LinkedHashMap 是以双向列表的结构做实现的,浏览key值时候,可以保证顺序。LinkedHashMap继承HashMap ,不同的是数据存储结构。

TreeMap 是以二叉树实现的Map接口。Map中的key值按照从小到大的顺序排列。key要实现comparable

 TreeMap  是用二叉树结构存储的,根据key找value的时间复杂度是o(以2为底,n的对数)

查找和插入的性能都没有hashmap好,但是可以实现key的有序存放。所以增加了hashMap的类。

二叉树的中序遍历就是从小到大的顺序排列。

分享到:
评论
3 楼 mycigar 2009-07-01  
<div class="quote_title">liu0107613 写道</div>
<div class="quote_div">
<p>Map 是一种数据结构,用来实现key和value 的映射。通过Key可以找到Value。实现类包括</p>
<p>HashMap,LinkedHashMap,TreeMap </p>
<p> </p>
<p> </p>
<p>    /**<br>     * Applies a supplemental hash function to a given hashCode, which<br>     * defends against poor quality hash functions.  This is critical<br>     * because HashMap uses power-of-two length hash tables, that<br>     * otherwise encounter collisions for hashCodes that do not differ<br>     * in lower bits. Note: Null keys always map to hash 0, thus index 0.<br>     */<br>    static int hash(int h) {<br>        // This function ensures that hashCodes that differ only by<br>        // constant multiples at each bit position have a bounded<br>        // number of collisions (approximately 8 at default load factor).<br>        h ^= (h &gt;&gt;&gt; 20) ^ (h &gt;&gt;&gt; 12);<br>        return h ^ (h &gt;&gt;&gt; 7) ^ (h &gt;&gt;&gt; 4);<br>    }</p>
<p> </p>
<p> </p>
<p>    /**<br>     * Returns index for hash code h.<br>     */<br>    static int indexFor(int h, int length) {<br>        return h &amp; (length-1);<br>    }</p>
<p> </p>
<p>    /**<br>     * Associates the specified value with the specified key in this map.<br>     * If the map previously contained a mapping for the key, the old<br>     * value is replaced.<br>     *<br>     * @param key key with which the specified value is to be associated<br>     * @param value value to be associated with the specified key<br>     * @return the previous value associated with &lt;tt&gt;key&lt;/tt&gt;, or<br>     *         &lt;tt&gt;null&lt;/tt&gt; if there was no mapping for &lt;tt&gt;key&lt;/tt&gt;.<br>     *         (A &lt;tt&gt;null&lt;/tt&gt; return can also indicate that the map<br>     *         previously associated &lt;tt&gt;null&lt;/tt&gt; with &lt;tt&gt;key&lt;/tt&gt;.)<br>     */<br>    public V put(K key, V value) {<br>        if (key == null)<br>            return putForNullKey(value);<br>        int hash = hash(key.hashCode());<br>        int i = indexFor(hash, table.length);<br>        for (Entry&lt;K,V&gt; e = table[i]; e != null; e = e.next) {<br>            Object k;<br>            if (e.hash == hash &amp;&amp; ((k = e.key) == key || key.equals(k))) {<br>                V oldValue = e.value;<br>                e.value = value;<br>                e.recordAccess(this);<br>                return oldValue;<br>            }<br>        }</p>
<p>        modCount++;<br>        addEntry(hash, key, value, i);<br>        return null;<br>    }</p>
<p> </p>
<p> </p>
<p>HashMap 是以数组的结构,用哈希函数值跟数组的长度做位与运算,获取对应数组的索引。浏览key值时,不保证顺序。<br>LinkedHashMap 是以双向列表的结构做实现的,浏览key值时候,可以保证顺序。LinkedHashMap继承HashMap ,不同的是数据存储结构。</p>
<p>TreeMap 是以二叉树实现的Map接口。Map中的key值按照从小到大的顺序排列。key要实现comparable</p>
<p> </p>
</div>
<p> </p>
<p>原来看数据结构的时候,我觉得没啥大用,后来看Java的时候,发现数据结构的重要性了。</p>
2 楼 liu0107613 2009-06-28  
非常感谢楼主的支持,刚开始研究这方面,很多方面的知识还需要学习,请楼主多多包涵。
我会继续努力的。。。。
1 楼 lovejavaei 2009-06-28  
理解的还不够深入,再往下研究,会有更多的收获

相关推荐

    java中map集合的用法.doc

    Java中的Map接口是Java集合框架的重要组成部分,它用于存储键值对的数据结构。Map不同于List,List是以索引来访问元素,而Map...在实际开发中,根据应用程序特定的需求,选择合适的Map实现能更好地优化数据结构和性能。

    java中map集合的用法

    Java中的Map接口是Java集合框架的重要组成部分,它用于存储键值对的数据结构,其中每个键都是唯一的,并且与一个值相关联。Map集合不同于List,因为它不维护元素的顺序,而是通过键来访问其对应的值。本文将详细介绍...

    重要知识java中map集合的用法.pdf

    Map 集合是 Java 中一种非常常用的数据结构,了解 Map 集合的用法、Map 接口和方法、Map 的实现类、Map 的遍历和优化等方面的知识点,可以帮助开发者更好地使用 Map 集合,提高应用程序的性能和效率。

    对java中Map集合的讲解

    Map是Java集合框架中的一个重要组成部分,它提供了一种存储键值对(key-value pair)数据结构的方式。与List和Set不同,Map并没有直接继承自`Collection`接口,而是独立于`Collection`体系之外。Map的主要特点是它通过...

    自定义map实现java的hashmap

    在Java编程中,HashMap是一个非常重要的数据结构,它实现了Map接口,提供了键值对的存储功能,具有快速存取和高效查找的特点。HashMap基于哈希表(也称为散列表)原理,通过键对象的哈希码来定位元素,进而实现O(1)...

    java中Map类.pdf

    Java中的Map接口是Java集合框架的重要组成部分,它用于存储键值对的数据结构。Map不同于数组和List,因为它不依赖于连续的索引访问元素,而是通过键(Key)来查找对应的值(Value)。Map接口提供了多种实现,如...

    java中Map类[归类].pdf

    此外,`equals(Object o)`和`hashCode()`方法用于比较Map对象的等价性和计算哈希值,这对于实现Map的比较和存放在哈希表中至关重要。 Map接口还有个内部类`Map.Entry`,它代表Map中的一个键值对。通过`Map.entrySet...

    Map实现类1

    了解这些知识点有助于理解和使用Java中的Map,特别是在处理大量数据时选择适合的Map实现类,以及在遍历和操作Map时选择高效的方式。在多线程环境中,如果需要线程安全,可以考虑使用ConcurrentHashMap。在需要有序...

    java Collection&Map

    总结起来,Java集合框架提供了多种数据结构和算法,通过接口和实现类的组合,可以根据实际需求选择合适的数据结构,同时通过Collections工具类进行便捷操作。正确实现equals()和hashCode()方法对于集合操作的正确性...

    金陵科技学院软件院大二上Java高级1212Map.docx

    在Java编程语言中,Map接口是集合框架的一部分,它提供了键值对的存储方式。Map不是列表或数组,而是关联键(key)与值(value)的容器,每个...通过实践这些示例,你可以更熟练地在Java项目中运用Map接口及其实现类。

    手写Java HaspMap

    HashMap是Java中的一个接口java.util.Map的实现类,它允许使用null键和null值。HashMap通过使用哈希函数将键映射到数组的特定位置,以实现快速查找、插入和删除操作。其时间复杂度通常为O(1),但在最坏的情况下,当...

    JAVA hashCode使用方法详解

    在Java编程语言中,`hashCode()` 和 `equals()` 方法是两个非常重要的概念,尤其是在处理集合类如 `List`, `Set`, `Map` 时。它们主要用于优化存储和查找效率,尤其是当涉及到哈希表(如 `HashMap` 和 `HashSet`)时...

    JAVA常用API文档 中文完整版.zip

    7. **异常处理**:Exception类及其子类构成异常层次结构,用于处理程序运行中的错误和异常情况。try-catch-finally语句块是处理异常的标准模式。 8. **日期时间**:Java 8引入了新的日期和时间API(java.time包),...

    java集合详解[归纳].pdf

    Java 集合是 Java 编程语言中最重要和最常用的数据结构之一。它提供了多种方式来存储和操作数据,从而提高了程序的效率和可读性。本文将对 Java 集合的基本概念、实现原理和常用方法进行详细的解释。 集合框架概述 ...

    实验05 Java集合.doc

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了一组高级的数据结构,...总之,这个实验深入地实践了Java集合框架的使用,加深了对集合概念、接口和实现类的理解,为后续的Java开发打下了坚实的基础。

Global site tag (gtag.js) - Google Analytics