资讯专栏INFORMATION COLUMN

JAVA HashMap

vspiders / 2041人阅读

摘要:采用链地址法来处理冲突这个就被赋值到里面去了。的应用非常广泛,是新框架中用来代替的类,也就是说建议使用,不要使用的方法是同步的,未经同步直接使用对象的中数组默认大小是,增加的方式是。中数组的默认大小是,而且一定是的指数

Hashmap采用链地址法来处理冲突:

  void addEntry(int hash, K key, V value, int bucketIndex) {
        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);
    }
   void createEntry(int hash, K key, V value, int bucketIndex) {
        Entry e = table[bucketIndex];
        table[bucketIndex] = new Entry<>(hash, key, value, e);
        size++;
    }
    

这个e就被赋值到next里面去了。
get的时候也是用链表来个get:

 final Entry getEntry(Object key) {
        if (size == 0) {
            return null;
        }

        int hash = (key == null) ? 0 : hash(key);
        for (Entry e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) { //注意这个大的for循环。循环一个链栈。next自然就在里面
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

HashMap产生的原因是不同的key会产生相同的数组下标地址。数组下标地址里面存了链表。查询的时候,先table[indexFor(hash, table.length)]找到数组下标,再根据key来寻找结果。
http://zhangshixi.iteye.com/blog/672697

什么是加载(装载因子):
加载因子是表示Hsah表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.

冲突的机会越大,则查找的成本越高.反之,查找的成本越小.因而,查找时间就越小.

因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的"时-空"矛盾的平衡与折衷.

loadfactor默认0.75,就是说差不多快满(默认取3/4)的时候重新hash/resize,这样可以避免hashmap里面每个table元素上的链表长度过长,影响hashmap的效率;
默认加载因子,加载因子是一个比例,当HashMap的数据大小>=容量*加载因子时,HashMap会将容量扩容
static final float DEFAULT_LOAD_FACTOR = 0.75f;
当实际数据大小超过threshold时,HashMap会将容量扩容,threshold=容量*加载因子
int threshold;
threshold是每次都要计算好的值。(扩容一次就计算一次)

HashMap本身存储的也是数组。。
Hashtable的应用非常广泛,HashMap是新框架中用来代替Hashtable的类,也就是说建议使用HashMap,不要使用Hashtable
1.Hashtable的方法是同步的,HashMap未经同步
2.Hashtable直接使用对象的hashCode
3.Hashtable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65309.html

相关文章

  • HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!

    摘要:线程安全是线程安全的,不是线程安全的。是添加的,貌似没人用过这个,栈长我也没用过。。最后一点有几个人知道知道的给栈长点个赞回应一下,不知道的有收获的也点一个赞支持一下吧。 HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的。 但你对这两者的区别了解有多少呢? 现在,栈长我给大家总结一下,或许有你不明朗的地方,在栈长...

    xiguadada 评论0 收藏0
  • HashMap ConcurrentHashMap

    摘要:与中的类似,也是一个数组加链表,不过这个线程安全。线程安全,但是它的线程安全是依赖将所有修改的代码块都用修饰。这是中实现线程安全的思路,由个组成,每个就相当于一个数组链表。线程安全,但性能差,不推荐使用。 问题描述 翻翻别人的面试经历 这里在知乎上看到的,分享出了自己面试阿里Java岗的面试题。 showImg(https://segmentfault.com/img/bVbfSZ5?...

    forrest23 评论0 收藏0
  • javaHashMap和Hashtable的区别

    摘要:的函数都是同步的,这意味着它是线程安全的。直接使用对象的。是的轻量级实现非线程安全的实现都完成了接口,主要区别在于能否键对值能为。同时其内部方法有区别中将的方法去掉了,改为和避免混淆。支持的遍历种类不同只支持迭代器遍历。 java在数据结构中的映射定义了一个接口java.util.Map。 Map包含三个实现类HashMap、Hashtable、TreeMap。Map是用来存储键对值 ...

    MudOnTire 评论0 收藏0
  • java中ConcurrentHashMap的使用及在Java 8中的冲突方案

    摘要:中的使用及在中的冲突方案引言简称是在作为的替代选择新引入的,是包的重要成员。为了解决在频繁冲突时性能降低的问题,中使用平衡树来替代链表存储冲突的元素。目前,只有和会在频繁冲突的情况下使用平衡树。 java中ConcurrentHashMap的使用及在Java 8中的冲突方案 1、引言 ConcurrentHashMap(简称CHM)是在Java 1.5作为Hashtable的替代选择新...

    kun_jian 评论0 收藏0
  • Java 容器学习之 HashMap

    摘要:底层的数据结构就是数组链表红黑树,红黑树是在中加进来的。负载因子哈希表中的填满程度。 前言 把 Java 容器的学习笔记放到 github 里了,还在更新~其他的目前不打算抽出来作为文章写,感觉挖的还不够深,等对某些东西理解的更深了再写文章吧Java 容器目录如下: Java 容器 一、概述 二、源码学习 1. Map 1.1 HashMap 1.2 LinkedHashM...

    Alex 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<