HashMap源码分析

HashMap和HashTable主要的区别在哪?

HashTable的方法上面带有同步锁
在这里插入图片描述

HashMap里面的key能不能是null? HashTable呢?

hashMap能,可以发现不会报错
在这里插入图片描述
HashTable不行
在这里插入图片描述
是在这里报的错
在这里插入图片描述

HashMap的历史

链表
链表加数组
链表加数组加红黑树

单纯链表的HashMap是如何实现的

package com.shiyi.controller;

import java.util.ArrayList;

public class ArrayListHashMap<K,V> {

    private ArrayList<Entry> arrayList = new ArrayList<Entry>();

    class Entry<K,V>{

        private K k;
        private V v;

        public Entry(K k, V v) {
            this.k = k;
            this.v = v;
        }
    }
    public void put(K k,V v){
        Entry entry = new Entry(k,v);
        arrayList.add(entry);
    }

    public V get(K k){
        for (Entry entry : arrayList) {
            if (entry.k.equals(k)){
                return (V) entry.v;
            }
        }
        return null;
    }

    public static void main(String[] args) {

        ArrayListHashMap<Object, Object> arrayListHashMap = new ArrayListHashMap<>();
        arrayListHashMap.put("a","97");
        arrayListHashMap.put("b",null);
        System.out.println(arrayListHashMap.get("a"));
        System.out.println(arrayListHashMap.get("b"));
    }
}

在这里插入图片描述

单纯链表存在的问题

如果Map中的entry对象特别多,就会像这样
在这里插入图片描述
这时候去get的话,就要遍历特别多次才能遍历到

HashMap源码中一些常量都是干嘛的

//默认的初始容量
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

//数组的最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;

//默认的负载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;

//树化阈值(链表长度超过这个才能变成树)
static final int TREEIFY_THRESHOLD = 8;

//树降级成为链表的节点
static final int UNTREEIFY_THRESHOLD = 6;

//最小的树化容量(不仅仅要达到树化阈值,总量还要达到这个,才能树化)
static final int MIN_TREEIFY_CAPACITY = 64;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值