美文网首页源码分析
Hashtable源码分析

Hashtable源码分析

作者: 丹青水 | 来源:发表于2018-07-06 17:18 被阅读0次

集合特性

对于集合框架我们的关注点一般在一下几点:

  1. 集合底层实现的数据结构是什么 数组+链表
  2. 集合中元素是否允许为空 否 key和value都不能为空
  3. 是否允许重复的数据 key唯一值
  4. 是否有序(这里的有序是指读取数据和存放数据的顺序是否一致) 否
  5. 是否线程安全。 是

针对这些问题,我们先来分析集合框架HashTable

HashTable分析

依赖关系
HashMap主要是继承自Dictionary,实现了Cloneable和Serializable接口使得HashMap具有克隆和序列化的功能、实现了Map接口因此具有Map的性质。

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable 

put方法分析

    public synchronized V put(K key, V value) {//方法前加synchronized 说明是线程安全的
        // Make sure the value is not null
        if (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);//hash冲突怎么办?
        return null;
    }

接着看下addEntry方法

    private void addEntry(int hash, K key, V value, int index) {
        modCount++;

        Entry<?,?> tab[] = table;//这个table也是个链表数组和hashmap一样
        if (count >= threshold) {//负载因子计算得的临界值
            // Rehash the table if the threshold is exceeded
            rehash();//和hashMap resize类似,扩容

            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);//hash 冲突直接放在链表后面
        count++;
    }
    

看下get方法

    public synchronized V get(Object key) {
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {// 遍历链表,通过equals找到key对应值
                return (V)e.value;
            }
        }
        return null;
    }

Hashtable的实现比较简单,就是单纯的数组+链表的形式,通过synchronized保证线程安全,但是对该方法加锁,效率不容乐观,目前使用场景并不多。

相关文章

  • Java 集合类原理

    Java基础——HashMap源码分析 Java基础——HashSet源码分析 Java基础——HashTable...

  • 00_Hashtable学习

    Hashtable源码分析 基于Java8Hashtable.class的说明: This class imple...

  • ConcurrentHashMap 原理和源码分析(一)

    通过之前几篇文章《HashMap原理和源码分析》 《HashTable原理和源码分析》《LinkedHashMap...

  • Hashtable源码分析

    集合特性 对于集合框架我们的关注点一般在一下几点: 集合底层实现的数据结构是什么 数组+链表 集合中元素是否允许...

  • Hashtable源码分析

    Hashtable Hashtable简介 和HashMap一样,Hashtable也是一个散列表,它存储的内容是...

  • Hashtable源码分析

    以下内容整理自互联网,仅用于个人学习 Hashtable简介 HashTable同样是基于哈希表实现的,同样每个元...

  • HashTable源码分析

    一、前言 前面几篇介绍了List相关的几个类。本篇开始分析Map相关的集合常用类的源码,OK,从HashTable...

  • HashTable源码分析

    HashTable跟HashMap在功能上来基本类似,其解决hash冲突的方法也是基于链地址法, 唯一的不同点在H...

  • HashTable源码分析

    Map的架构 [图片上传失败...(image-7ca267-1571749288939)]从上面图中可以看出,M...

  • Hashtable源码分析

    Map接口 Map是java集合中很重要的一个接口,我们在开发中经常用到,Map接口有一个特性 无序 不可重复 k...

网友评论

    本文标题:Hashtable源码分析

    本文链接:https://www.haomeiwen.com/subject/uxebuftx.html