【Java学习】Java学习之HashMap分析与理解

来源:互联网 发布:淘宝图片优化软件 编辑:程序博客网 时间:2024/06/06 07:27

HashMap知识

1.基础知识

  1. 数据结构:数组+链表+红黑树(JDK1.8);
  2. hash表存储数据,使用开放地址法和链地址法来解决hash冲突。Java中的HashMap使用的是链地址法,即数组+链表,在每个数组元素上都有一个链表结构,先获取数据hash值得到数组下标,然后把数据放在链表后面。为了避免存放位置一致即Hash碰撞,这就需要优秀的Hash算法以及扩容机制。
  3. HashMap根据键的hashCode存储数据,但不保证获取数据顺序与存储一致;
  4. 允许最多一条键为null,但值允许多个null;
  5. 初始化长度length为16,负载因子Load factor为0.75,HashMap能够容纳的最大数据量键值对threshold为length*Load factor。超过最大容量就需要进行resize扩容,扩容后是之前的两倍。在阿里巴巴开发规范中建议初始化时定义length。
  6. 为解决拉链过长,JDK1.8中加入了红黑树,当链表长度过长(默认超过8),链表就会转换为增删改查速度快的红黑树提高对它的操作性能。

2.线程安全

2.1Collections.synchronizedMap()

HashMap是线程不安全的,可以使用Collections.synchronizedMap()方法进行包装普通HashMap。
        Map<String,Object> map = new HashMap<String,Object>(16);        Map<String, Object> synchronizedMap = Collections.synchronizedMap(map);
    public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {        return new SynchronizedMap<>(m);    }
通过mutex实现对该m的互斥操作,来保证线程安全,但是在多线程条件下性能有些不足,每次的操作都需要获取mutex的锁。
private static class SynchronizedMap<K,V>        implements Map<K,V>, Serializable {        private static final long serialVersionUID = 1978198479659022715L;        private final Map<K,V> m;     // Backing Map        final Object      mutex;        // Object on which to synchronize        SynchronizedMap(Map<K,V> m) {            this.m = Objects.requireNonNull(m);            mutex = this;        }        SynchronizedMap(Map<K,V> m, Object mutex) {            this.m = m;            this.mutex = mutex;        }
get方法:需要先获取mutex的锁。
public V get(Object key) {            synchronized (mutex) {return m.get(key);}        }

2.2使用分段锁的ConcurrentHashMap

使用减少锁粒度的方法来削弱多线程锁的竞争,因此ConcurrentHashMap内部细分了若干个小的HashMap,默认情况下为16段。比如put时,根据hashcode判断需要放进的段,然后对之加锁来完成put操作。多线程下,只要被加入的数据不存放在同一个段中,即能有效提高性能。
获取全局的信息比如size时,需要同时获得所有段的锁才能计算size(一般先用无锁方式进行获取)。

3.比对

HashMap、HashTable 线程安全是否存取有序底层实现key为nullvalue为null容量扩容实现接口HashMap否否数组+链表+红黑树(JDK1.8部分)最多允许一个null允许默认16*0.75*2Map接口HashTable是否数组+链表否否默认11*0.75*2+1Dictionary抽象类
Map接口





原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我的手机号被别人绑定了快手怎么办 微信密码忘记了没绑定手机号怎么办 扣扣绑定银行卡忘记密码了怎么办 扣扣忘记密码了又换手机号了怎么办 微信订阅号里有删除后的信息怎么办 申请微信公众号邮箱已被占用怎么办 公众号验证没有对公账户怎么办 qq密码忘记了怎么办手机绑定没有 我的扣扣怎么申诉都找不回来怎么办 装修装的不好又没有签合同怎么办 日本免税的零食不小心拆了怎么办 闲鱼同意买家退货了买家不退怎么办 手机里淘宝钱付了不发货怎么办 百度云下载手机储存空间不足怎么办 苹果8的照片储存空间满了怎么办 为什么下载的软件已停止运行怎么办 苹果手机刷机忘记注册邮箱了怎么办 刺激战场模拟器注册已达上限怎么办 用模拟器玩刺激战场注册上限怎么办 微信解除实名认证后退款怎么办 苹果为什么qq收消息有延迟怎么办 qq忘记密码手机号也换了怎么办 扣扣空间圈人时照片服务错误怎么办 删了qq好友怎么找回来怎么办 苹果5s语音控制打开了怎么办 lv迷你水桶包肩带长了怎么办 在香港买个lv包包过海关怎么办 国际快递手表被海关查应该怎么办 把档案放到人才市场后报到证怎么办 皮表带带久了有异味怎么办 英语中用词不当和拼写错误怎么办 爬楼梯的购物车车轮坏了怎么办? 帮别人买东西不给我钱怎么办 老师念错名字有同学指出来你怎么办 老公婚前买的房子婆婆想霸占怎么办 我想查我的基金收益情况怎么办 儿童票买好了但大人退票了怎么办 没有享受到国家政策的农民怎么办? 股票涨了没抛然后一直跌怎么办 苹果手机放久了开不了机怎么办 部门要辞退你你不想走该怎么办