文档章节

hashmap简介

Object_小风
 Object_小风
发布于 2016/07/04 14:16
字数 420
阅读 26
收藏 2
  • hashmap是一个键值对的无序数组。通过hashcode指引内存地址获取值。
    hashmap不是有序数组,也不是散列链表,他可以理解为一个无序的数组,通过hashcode去映射。

    hashmap在第一次put的时候,会初始化键值对数组的大小16,加载因子0.75,当数组超过16*0.75=12的时候,数组会扩容2倍。

    hashmap的put方法源码
    public V put(K key, V value) {
    if (table == EMPTY_TABLE) {
    //如果第一次加载,判断是空数组,初始化大小16
    inflateTable(threshold);
    }
    if (key == null)
    //hashmap支持null键,通过单独的方法put
    return putForNullKey(value);
    //获取key的hashcode,如果有就替换旧的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;
    //如果当前索引有value,就替换
    if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
    V oldValue = e.value;
    //将新value放到e.v中
    e.value = value;
    //没任何实现,是个空方法
    e.recordAccess(this);
    return oldValue;
    }
    }
    //结构性更改次数加1
    modCount++;
    //添加新元素
    addEntry(hash, key, value, i);
    return null;
    }

    //添加元素方法
     void addEntry(int hash, K key, V value, int bucketIndex) {
    threshold就是16*0.75,当map在使用75%时候会扩容
        if ((size >= threshold) && (null != table[bucketIndex])) {
            resize(2 * table.length);
            hash = (null != key) ? hash(key) : 0;
            bucketIndex = indexFor(hash, table.length);
        }
       //添加元素
        createEntry(hash, key, value, bucketIndex);
    }
    

    hashmap get方法;
    public V get(Object key) {
    if (key == null)
    return getForNullKey();
    Entry<K,V> entry = getEntry(key);

        return null == entry ? null : entry.getValue();
    }
    
    
    //获取hashcode,直接获取值,效率高
     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;
    }

© 著作权归作者所有

上一篇: 关于微信支付
下一篇: redis主从复制
Object_小风
粉丝 3
博文 43
码字总数 20927
作品 0
朝阳
程序员
私信 提问
HashMap和HashTable简介和区别

一、HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 HashMap是非线程安全的,只是用于单...

光明辉煌
2018/04/17
0
0
Java中的常用Map:HashMap、Hashtable、LinkedHashMap、Tre...

Java自带了各种Map类,可归为三种类型: 1.通用Map,用于在应用程序中管理映射,通常在 java.util 程序包中实现 HashMap Hashtable Properties LinkedHashMap IdentityHashMap TreeMap WeakH...

foxeye
2013/09/30
0
0
java集合框架总结(六)

一、Map 简介 Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 Key,另外一组用于保存 Map 里的 Value Map 中的 key 和 value 都可以是任何引用类型...

hapier
2016/09/09
15
0
Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例

概要 这一章,我们对HashSet进行学习。 我们先对HashSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashSet。内容包括: 第1部分 HashSet介绍 第2部分 HashSet数据结构 第3...

文文1
2017/11/07
0
0
HashMap-你可能需要知道这些

HashMap是Android程序员(当然也包括Java程序员)经常使用的映射数据类型,伴随着JDK的版本更新,JDK1.8相比1.7对HashMap的底层实现了一些优化,尤其是红黑树这个点(现在面试的时候基本都会问...

24K男
2017/10/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
1
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
2
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部