HashTable源码

引子

看到一个关于HashMap和HashTable对比的面试题,于是简单看了下HashTable的源码,简单记录下。

概述

与HashMap相似的哈希表结构,有很多不同点:

  • 节点数组的初始化是在构造函数中完成的,初始容量11,负载因子0.75;
  • hashTable内部使用synchronized实现线程安全;
  • hashTable的k v 都不能为null,否则NPE;
  • 内部使用数组 + 链表的结构,没有链表转红黑树的过程。
  • 添加元素时检测并触发扩容,扩容时,容量是原容量的2倍+1
    注意:

仅做源码学习,不推荐使用。

" 如果不需要线程安全的实现,建议使用HashMap代替Hashtable 。如果需要线程安全的高并发实现,则建议使用java. util. concurrent. ConcurrentHashMap代替Hashtable "

------------来自hashTable类说明

put流程

复制代码
private void addEntry(int hash, K key, V value, int index) {
    Entry<?,?> tab[] = table;
    if (count >= threshold) { // 触发扩容
        // Rehash the table if the threshold is exceeded
        rehash(); // 2倍 +1 扩容,复制数组,重新计算元素的hash

        tab = table;
        hash = key.hashCode();
        index = (hash & 0x7FFFFFFF) % tab.length;
    }

    // Creates the new entry.
    @SuppressWarnings("unchecked")
    Entry<K,V> e = (Entry<K,V>) tab[index];
    tab[index] = new Entry<>(hash, key, value, e);
    count++;
    modCount++;
}

题外话:

与HashMap和ConcurrentHashMap不同的是,hashTable中,put 和 **putIfAbsent **方法是两个独立的方法,竟然没有通过参数传递来复用。重复代码,妥妥的!!!在HashMap和ConcurrentHashMap中,这种情况就没有了😄。

相关推荐
wangmengxxw1 分钟前
SpringAI-MySQLMcp服务
java·人工智能·mysql·大模型·sse·springai·mcp
weixin_449290011 分钟前
EverMemOS 访问外部(deepinfra)API接口
java·服务器·前端
爱装代码的小瓶子17 分钟前
【Linux基础】操作系统下的进程与虚拟内存的关系
android·java·服务器
淮北49419 分钟前
大模型学习(二、使用lora进行微调)
java·服务器·学习
瑞雪兆丰年兮20 分钟前
[从0开始学Java|第一天]Java入门
java·开发语言
我爱娃哈哈20 分钟前
SpringBoot 实现 RSA+AES 自动接口解密
java·spring boot·后端
崎岖Qiu20 分钟前
SpringBoot:基于注解 @PostConstruct 和 ApplicationRunner 进行初始化的区别
java·spring boot·后端·spring·javaee
东东最爱敲键盘22 分钟前
第7天 进程间通信
java·服务器·前端
九皇叔叔24 分钟前
【04】SpringBoot3 MybatisPlus 查询(Mapper)
java·mybatis·mybatis plus
人道领域26 分钟前
javaWeb从入门到进阶(SpringBoot基础案例)
java·开发语言·spring