zoukankan      html  css  js  c++  java
  • Hashmap与Hashtable的区别及Hashmap的原理

    Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap(线程安全的map)吧。

    ConcurrentHashMap的工作机制:通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。

    /***************************************************************/

    HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:

    1、HashMap是非synchronized的(线程非安全,速度快),hashtable是synchronized的(线程安全,速度慢);

    2、HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行。

    Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

    /***************************************************************/

    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。

    当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket(可以理解为容器,比如桶)位置来储存值对象。

    当获取对象时(get方法),通过键对象的equals()方法找到正确的键值对,然后返回值对象。

    HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

    当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

    因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。

    因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。

    /***************************************************************/

    HashMap可以通过下面的语句进行同步:
    Map m = Collections.synchronizeMap(hashMap);

    /***************************************************************/

    自己理解的hashmap的原理:便于查找,因为分类了,不用一个一个的去找,优于二分法之类的算法,用key的hashcode值和整个线性数组的长度进行取余操作,得到对应的数组中的下标值,而这个数组存储的是一个链表,每个链表的节点都存储着一个entry存储

    我参考的相关链接:

    http://blog.csdn.net/vking_wang/article/details/14166593(写的好)

    http://blog.csdn.net/fenglibing/article/details/8905007(这个写的很好);

    http://www.importnew.com/7010.html;(纯理论)

    http://www.importnew.com/7099.html;(纯理论)

    HashMap的容量与扩容:http://blog.csdn.net/gaopu12345/article/details/50831631

  • 相关阅读:
    jackson 枚举 enum json 解析类型 返回数字 或者自定义文字 How To Serialize Enums as JSON Objects with Jackson
    Antd Pro V5 中ProTable 自定义查询参数和返回值
    ES6/Antd 代码阅读记录
    es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
    Antd Hooks
    使用.Net Core开发WPF App系列教程(其它 、保存控件内容为图片)
    使用.Net Core开发WPF App系列教程( 三、与.Net Framework的区别)
    使用.Net Core开发WPF App系列教程( 四、WPF中的XAML)
    使用.Net Core开发WPF App系列教程( 二、在Visual Studio 2019中创建.Net Core WPF工程)
    使用.Net Core开发WPF App系列教程( 一、.Net Core和WPF介绍)
  • 原文地址:https://www.cnblogs.com/xh_Blog/p/7127663.html
Copyright © 2011-2022 走看看