博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hashmap与Hashtable的区别及Hashmap的原理
阅读量:4621 次
发布时间:2019-06-09

本文共 1654 字,大约阅读时间需要 5 分钟。

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

转载于:https://www.cnblogs.com/YLQBL/p/7127663.html

你可能感兴趣的文章
c++ 基础用法、基础知识以及一些常规的操作
查看>>
leetcode 129. Sum Root to Leaf Numbers
查看>>
lua
查看>>
Java Day 05
查看>>
Android--context.startActivity(i…
查看>>
XML之外部加载并创建节点
查看>>
vue+koa+mysql简易demo
查看>>
castle windsor学习-----Inline dependencies 依赖
查看>>
Java中获取键盘输入值的三种方法
查看>>
职场如何汇报工作-不会汇报工作如何混职场
查看>>
《大道至简》第二章 读后感
查看>>
Centos7 搭建Svn+Apache服务器
查看>>
PHP之时间函数
查看>>
Vue之阻止默认行为
查看>>
Django一些操作命令
查看>>
Python open()完整参数
查看>>
django里面DTL使用for循环时,获取当前循环次数使用{{forloop.counter}}
查看>>
Linux基础-host文件解析
查看>>
PHP "延迟静态绑定" 功能,static
查看>>
(二)部署solr7.1.0到tomcat
查看>>