1.先看hashtable的源代码

 public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[] = table;int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;@SuppressWarnings("unchecked")Entry<K,V> entry = (Entry<K,V>)tab[index];for(; entry != null ; entry = entry.next) {if ((entry.hash == hash) && entry.key.equals(key)) {V old = entry.value;entry.value = value;return old;}}addEntry(hash, key, value, index);return null;}

下面是hashMap的put方法

public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}//hash方法
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
//putVal方法final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);else {Node<K,V> e; K k;if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;else if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else {for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);break;}if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}if (e != null) { // existing mapping for keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}++modCount;if (++size > threshold)resize();afterNodeInsertion(evict);return null;}

通过比较可以看出

(1)hashtable是线程安全的,它在方法上加了synchronized关键字,会锁定整个链表,效率低;

  hashMap是非线程安全的

(2)hashtable key和value都不能为null,而hashMap key和value都可以是null

  hashtable的put方法,进去就直接调用了key.hashCode(),这样如果key是null,是会抛出异常的,然后做判断,如果value是null,也抛出异常

  hashMap,先把key做了判断,如果key是null则其hashcode设置为0,value是null可以存入map

  

通过源码可以看到,hashtable的put方法是线程安全的

转载于:https://www.cnblogs.com/fubaizhaizhuren/p/5107443.html

hash-4.hashtable相关推荐

  1. Hash(4) hashtable,hashmap

    首先,我们要知道set是利使用map是实现的,因为只要利用map中的key唯一性就行了. 1.hashmap 和hashtable的区别是什么? 我们可以背出:  hashtable线程安全.hash ...

  2. 源码解析-深刻理解Hash HashTable HashMap原理及数据hash碰撞问题

    HashMap 前言 Hash HashTable 开地址法 线性探测法 平方探测法 双重散列探测法 拉链法 哈希表优势 HashMap 变量介绍 初始容量和负载因子 红黑树和链表转化 HashMap ...

  3. java 中的 Enumeration 在Vector,Hashtable和web中的应用

    public interface Enumeration<E> 实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个.连续调用 nextElement方法将返回一系列的 ...

  4. string生成固定长度的哈希_Redis 选择Hash还是String 存储数据?

    点击上方"Java之间",选择"置顶或者星标" 你关注的就是我关心的! 作者:goodspeed 微信公众号:四月(ID:hiiiapril) 在stackov ...

  5. Gold Balanced Lineup - poj 3274 (hash)

    这题,看到别人的解题报告做出来的,分析: 大概意思就是: 数组sum[i][j]表示从第1到第i头cow属性j的出现次数. 所以题目要求等价为: 求满足 sum[i][0]-sum[j][0]=sum ...

  6. java哈希_Java Hashtable 类

    Java Hashtable 类 Hashtable是原始的java.util的一部分, 是一个Dictionary具体的实现 . 然而,Java 2 重构的Hashtable实现了Map接口,因此, ...

  7. 哈希表创建哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构.typedef enum{ HASH_OK-icoding-数据结构-C

    哈希表创建 typedef enum{HASH_OK,HASH_ERROR,HASH_ADDED,HASH_REPLACED_VALUE,HASH_ALREADY_ADDED,HASH_DELETED ...

  8. DotNet中的集合对象(2): Hashtable

    Hashtable(哈希表)也是一个可变长的数组,表中的每个项目可以通过关键字Key值来访问.关键字一般是某个字符串,也可以是其它类型的对象.每个元素本身不是唯一的,但每个元素本身必需有一个惟一的关键 ...

  9. Hashtable用法

    哈希表是一种重要的存储方式,也是一种常见的检索方法.其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元 ...

  10. Hashtable和Hashset

    哈希表是一种重要的存储方式,也是一种常见的检索方法.其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元 ...

最新文章

  1. 微软提出CLIPBERT:通过稀疏采样的视频语言学习
  2. 允许使用抽象类类型 isearchboxinfo 的对象_Java新手必学:面向对象的特性都有哪些?...
  3. 多商家分销商城系统如何开发?
  4. windows共享linux的某一文件夹
  5. 图灵奖得主Judea Pearl :从“贝叶斯网络之父”到“AI社区的叛徒”
  6. C++指针与内存泄露
  7. codeforces 960A Check the string
  8. 都说了多少遍,不要再学 JSP 了!
  9. oracle-sqlloader的简单使用
  10. MemoryInjector 无痕注入
  11. 运算符在计算机语言中的作用,深入解析C++编程中范围解析运算符的作用及使用...
  12. 拓端tecdat|Python实现谱聚类Spectral Clustering算法和改变簇数结果可视化比较
  13. 维纳滤波python 函数_加性高斯白噪声及维纳滤波的基本原理与Python实现
  14. 激光投影仪对比激光电视 成像原理和适用范围
  15. 自主导航:赋予移动机器人智能感知与运动的能力
  16. 【年度总结】于无声处听惊雷-2016年度总结
  17. 凌恩客户文章:16S全长鉴定癌症细胞组织特异性微生物谱
  18. android手机安装ubuntu并创建ubuntu图形界面(1)
  19. spark-sql运行报错 ERROR server.TransportRequestHandler: Error while invoking RpcHandler#receive() on RPC
  20. ATH(阿里、腾讯、华为)三家云服务器厂商对比

热门文章

  1. Maven项目添加FindBugs、PMD插件
  2. Oracle索引简单介绍与示例
  3. Running Trinity in multiple steps
  4. 因为项目管理知识体系指南(PMBOK)初识宝地
  5. 让你的 Qt 桌面程序看上去更加 native(三):自定义 style
  6. 程序员是如何捕猎大象的[转]
  7. python jpg 压缩因子_IOS图像2之jpg、png图片保存、互转、设置有损压缩因子
  8. 腾讯ai开放平台 手册_创建手册以实现大规模开放
  9. 跟踪 linux 内核调用_Linux用户和内核空间中的动态跟踪
  10. ho1365_共享力量的四种方法,而不是ho积