`
endual
  • 浏览: 3558365 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java HashMap的实现

    博客分类:
  • java
 
阅读更多

 

 

今天很好奇,去看了HashMap的实现代码

 

    这个是插入代码:

 

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;
    }

 

    哈希函数: 

    int hash = hash(key.hashCode());

 

     key.hashCode()的实现

 

     Object.java中的实现

 

    public native int hashCode();

 

 

     HashMap.java中的实现


public final int hashCode() {
            return (key==null   ? 0 : key.hashCode()) ^
                   (value==null ? 0 : value.hashCode());
        }

 

 

  反正这用到了hash函数(废话吗)!!

 

  中间插入下

 

  public HashMap() {
  this.loadFactor = DEFAULT_LOAD_FACTOR;
        threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
        table = new Entry[DEFAULT_INITIAL_CAPACITY];
        init();
    }
 

    hashmap是用数组来保存的  table = new Entry[DEFAULT_INITIAL_CAPACITY];

    最初是初始化16个存储位置。

    static final int DEFAULT_INITIAL_CAPACITY = 16;

 

 

    回来在看插入的代码

    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;  //如有有相同的key,那么就返回了
            }
        }

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

 

 

  里面他做了一个for循环,查找是否有相同的key,如果有,那么就覆盖掉

 

   /**

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

   返回一个索引

    addEntry(hash, key, value, i); //添加数据了,当另一个方法中去了

 

    /**

     * Adds a new entry with the specified key, value and hash code to
     * the specified bucket.  It is the responsibility of this
     * method to resize the table if appropriate.
     *
     * Subclass overrides this to alter the behavior of put method.
     */
    void addEntry(int hash, K key, V value, int bucketIndex) {
	Entry<K,V> e = table[bucketIndex];
        table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
        if (size++ >= threshold)
            resize(2 * table.length);
    }

 

  添加一个实体对象了,还包含了一个方法,这个方法应该是

当数组中都满了,创建新的数组,然后复制原来的数到新的数组中去。不是平常的for循环复制了,要引入hash函数。

 

 

 void resize(int newCapacity) {
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;
        if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return;
        }

        Entry[] newTable = new Entry[newCapacity];
        transfer(newTable);
        table = newTable;
        threshold = (int)(newCapacity * loadFactor);
    }
 

   有又新的方法

    /**

     * Transfers all entries from current table to newTable.
        转移当前的数组到新的数组,不是Copy,是转移
     */
    void transfer(Entry[] newTable) {
        Entry[] src = table;
        int newCapacity = newTable.length;
        for (int j = 0; j < src.length; j++) {
            Entry<K,V> e = src[j];
            if (e != null) {
                src[j] = null;
                do {
                    Entry<K,V> next = e.next;
                    int i = indexFor(e.hash, newCapacity);
                    e.next = newTable[i];
                    newTable[i] = e;
                    e = next;
                } while (e != null);
            }
        }
    }
 

 

 他们的代码写的真好啊。。。。。。

 

 

分享到:
评论

相关推荐

    Java中用hashmap实现购物车

    Java语言使用hashmap实现向购物车添加删除修改商品,显示商品信息

    java HashMap原理分析

    5. Java中HashMap的应用和实现 详细解释: 1. 哈希函数的原理和应用 哈希函数是一种将输入数据转换为固定长度的哈希码的函数。在HashMap中,哈希函数用于将Key转换为一个哈希码,然后根据哈希码将Key-Value对存储...

    Java HashMap类详解

    本资源详细介绍了 Java 中的 HashMap 类,包括其实现机制、Hash 存储机制、集合存储机制等方面的知识点。 1. HashMap 和 HashSet 的关系 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,虽然...

    js 版 java hashmap

    7. **键的类型支持**:JavaScript的HashMap实现可能需要支持各种类型的键,包括字符串、数字、对象等,这就需要处理不同类型的键如何哈希和比较的问题。 8. **性能优化**:为了提高性能,可能需要对一些常见操作...

    深入解析java HashMap实现原理

    Java中的HashMap是一个非常重要的数据结构,它实现了Map接口,提供了高效的数据存储和检索功能。HashMap的核心实现基于哈希表,其内部数据结构是数组与链表的结合,也就是所谓的“链表散列”结构。 1. **HashMap...

    详解Java HashMap实现原理

    以下是对HashMap实现原理的详细解析。 首先,HashMap内部使用了一个瞬时变量数组`table`(也称为“桶”)来存储键值对。桶是一个Entry对象数组,它的大小可以动态调整,并且长度必须是2的幂。初始时,`table`是一个...

    Java8 HashMap的实现原理分析

    Java8之后新增挺多新东西,接下来通过本文给大家介绍Java8 HashMap的实现原理分析,对java8 hashmap实现原理相关知识感兴趣的朋友一起学习吧

    Java HashMap实现原理分析(一)

    总的来说,Java HashMap的实现原理主要包括以下几个关键点: 1. 基于哈希表的数据结构,使用数组+链表的方式存储键值对。 2. 使用键的哈希值计算数组索引,通过异或和位移操作优化哈希分布。 3. 链地址法解决哈希...

    Java中HashMap的工作机制

    在Java中,HashMap是一种广泛使用的数据结构,它基于哈希表的Map接口实现。哈希表是一种通过哈希过程将键映射到特定位置的数据结构,该位置存储了键对应的值。在详细探讨Java中HashMap的工作机制之前,首先需要理解...

    hashmap实现原理

    通过`hashCode()`和`equals()`的合理使用,以及数组和链表的结合,HashMap实现了高效的键值对存储和查找。了解这些实现细节对于优化代码性能和避免潜在问题至关重要。在实际编程中,应充分考虑哈希冲突的处理、负载...

    自定义map实现java的hashmap

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

    基于HashMap的用户标签处理兼Java中HashMap实现原理研究.pdf

    "基于HashMap的用户标签处理兼Java中HashMap实现原理研究" 本文研究了基于HashMap的用户标签处理方法,并对Java中HashMap的实现原理进行了深入研究。HashMap是一种高效的数据结构,可以快速地存储和检索数据。本文...

    Java-HashMap.rar_hashmap_java hashmap

    在Java编程语言中,`HashMap`是`java.util`包中的一个核心类,它属于集合框架的一部分,主要用于存储键值对的数据结构。`HashMap`基于哈希表(散列表)实现,提供了快速的插入、删除和查找操作,平均时间复杂度为O(1...

    Java HashMap高难度面试题集锦解析Java HashMap面试题及答案解析-高难度

    使用ConcurrentHashMap,它是线程安全的HashMap实现,适用于多线程环境。 理解这些知识点对于深入理解Java的集合框架以及优化并发编程至关重要。在面试中,候选人需要能够清楚地解释这些概念,并在必要时提供代码...

    深入Java集合学习系列:HashMap的实现原理

    在Java编程语言中,集合框架是开发者日常工作中不可或缺的一部分,HashMap作为其中的重要成员,它的实现原理对于理解Java性能优化和数据结构有深远的意义。HashMap是一个基于哈希表的数据结构,它实现了Map接口,...

    java中HashMap详解.pdf

    Java中的HashMap是一种基于散列机制的Map接口的实现,它允许我们存储键值对。键是唯一的,而值可以重复。HashMap在处理数据时非常高效,因为其操作的时间复杂度接近于O(1)。这是通过使用散列函数将键映射到相应的...

    Java使用HashMap实现并查集

    Java使用HashMap实现并查集 Java使用HashMap实现并查集是指使用Java语言中的HashMap数据结构来实现并查集。并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以...

    用hashmap实现词典查询

    总的来说,通过HashMap实现词典查询,我们可以充分利用其高效的查找机制,为用户提供快速的查询服务。同时,理解HashMap的内部机制对于优化查询性能和处理潜在问题至关重要。在实际项目中,还需要考虑如何优雅地处理...

    java 使用web service读取HashMap里的数值

    通过以上步骤,我们成功地实现了使用Java WebService读取`HashMap`中的数值的功能。这种做法不仅适用于简单的数据交换场景,还能够扩展到更复杂的业务逻辑处理中。对于开发者而言,理解和掌握这一技术是构建稳定可靠...

Global site tag (gtag.js) - Google Analytics