hash map 实现原理

  1. HashMap 的存取实现
// 存储时:
int hash = key.hashCode(); // 这个hashCode 方法这里不详述,只要理解每个key的hash是一个固定的int值
int index=hash % Entry[].length;
Entry[index]=value;
// 取值时
int hash=key.hashCode(); 
int index=hash % Entry[].length;
return Entry[index];

1.1 put

public V put(K key, V value){
    if(key==null)
        return putForNullKey(value); //null 总是放在数组的第一个链表中
    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;
        // 如果key在链表中已经存在,则替换为新value
        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;
}

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); // 参数e,是Entry.next
    // 如果size超过threshold,则扩充table大小。再散列
    if(size++>=threshold)
        resize(2*table.length);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算...
    曹振华阅读 2,526评论 1 37
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,288评论 0 16
  • 生活处处有惊喜,之前有人问我老了是否养猫养狗,我说不养,除非我疯了。不养不是不喜欢,而是因为觉得楼房里不接...
    一笑而过yangl阅读 255评论 0 1
  • 同心圆是将组织契约按照四种共同体划分的一种方式,它与cua的四象限法有异曲同工之处。 组织契约:分为四种共同团体,...
    先胜而后战阅读 927评论 0 0