资讯专栏INFORMATION COLUMN

JAVA HashMap

vspiders / 1953人阅读

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

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
  • # Day18-Java基础

    摘要:所有的方法都是异步的,属于线程不安全操作。子类提供三大主要类。以上无法传入空值并对其进行输出。数据分桶第桶第桶第桶采用分桶之后每一个数据必须有一个明确的分桶标记,很明显使用。操作张三张三出现以上问题是因为没有实现接口。 ...

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

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

    Alex 评论0 收藏0

发表评论

0条评论

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