java之HashTable

一、HashTable

1.1基本数据结构

首先根据上图,并结合代码,来看一下HashTable的基本数据结构:

根据代码,可以看出HashTable是一个Entry<>的数组,那Entry又是什么呢?HashTable中的Entry是HashTable.class的一个内部类,来看一下源代码:

这里,我们关注它的四个字段,hash、key、value、next。这里的hash也就是之所以叫Hashtable的原因之一。这个hash数值是根据特定的hash算法得出的,详细内容可以找相应的hash算法资料,这里就不介绍了。接下来说,next字段,next字段是当hash产生重复的时候,以链表保存新传入的hash值对应的key和value。根据Entry的注释可以很容易明白,这里的Enrty是当发生hash碰撞时的list元素。

1.2 构造方法

以上是源码中的三个构造方法(还有一个是clone的构造方法)。可以在上图中看到,如果不指定initialCapacity和loadFactor,默认为11和0.75。

到这里,可能又有人要问,initialCapacity和loadFactor是什么。从上图的构造方法一中,可以清楚的看到,initialCapacity为初始化Entry[]数组的大小,而loadFactor用来参与计算一个阈值。这个阈值是后面为HashTable扩容使用的,当HashTable中的所有Entry的个数大于阈值时,HashTable即进行扩容。具体代码会在后面put方法中给出。

1.3 主要方法(put && remove)

put:

以上就是put方法的主体,值得注意的是,该方法被关键字sychronized所限定。从for循环中可以看到,如果有put相同的值,原有的值会被覆盖。

这一段是addEntry方法,从if语句中可以看到,如果count值大于阈值(count值为HashTable中所有Entry的值),则进行rehash(),rehash()的代码在下面给出,其主要工作就是对原HashTable进行扩容,并且对其中的原有的Entry重新hash。扩容后新的Entry[]大小为原Entry[]大小的2倍+1。

remove:

逻辑和put的差不多。就是找到对应的项,然后做操作。这里,remove方法仍然是被关键字sychronized所限定。

时间: 2024-10-12 19:55:39

java之HashTable的相关文章

JAVA的Hashtable在遍历时的迭代器线程问题

这篇博客主要讲什么 Hashtable及其内部类的部分源码分析 Hashtable在遍历时的java.util.ConcurrentModificationException异常的来由和解决 单机在内存中缓存数据并定期清除过期缓存的简单实现 事情的起因 工作中需要在某个业务类中设置一个将一些对象缓存在内存中的一个缓存机制(单机).于是有了以下类似结构的实现: 1 package org.cnblog.test; 2 3 import java.util.Hashtable; 4 import j

Java之Hashtable、HashMap及Properties

HashTable继承于比较古老的Dictionary,而HashMap是接口Map的实现. HashMap是HashTable的一个轻量级实现,HashMap不是线程安全的,而HashTable是线程安全的. HashMap允许key或者value为null,而HashTable是不允许的. 在效率方面:HashMap的效率略过于HashTable. 而Properties是HashTable的子类,不过Properties添加了两个方法,load()和store()可以直接导入或者将映射写入

Java 集合Hashtable源码深入解析

概要 前面,我们已经系统的对List进行了学习.接下来,我们先学习Map,然后再学习Set:因为Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的). 首先,我们看看Map架构.如上图:(01) Map 是映射接口,Map中存储的内容是键值对(key-value).(02) AbstractMap 是继承于Map的抽象类,它实现了Map中的大部分API.其它Map的实现类可以通过继承AbstractMap来减少重复编码.(

java.util.HashMap和java.util.HashTable (JDK1.8)【转】

一.java.util.HashMap 1.1 java.util.HashMap 综述 java.util.HashMap继承结构如下图 HashMap是非线程安全的,key和value都支持null HashMap的节点是链表,节点的equals比较的是节点的key和value内容是否相等. 1 static class Node<K,V> implements Map.Entry<K,V> { 2 final int hash; 3 final K key; 4 V valu

java遍历hashTable

//获取key值 Enumeration k = lovResults.keys();while(k.hasMoreElements()){ System.out.println(k.nextElement());} //获取VALUE值 Enumeration e = lovResults.elements(); while(e.hasMoreElements()){ System.out.println(e.nextElement()); } Java中如何遍历Map对象的4种方法 Java

java该HashTable,HashMap和HashSet

同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的三个集合HashTable,HashSet和HashMap具体解释. 本文文件夹: 1. HashTable和HashMap的差别 2. HashSet和HashMap的差别 3. HashMap,HashSet工作原理 4. HashSet工作原理 5. 常见问题 1. HashTable和HashMap的

JAVA的HashTable源码分析

Hashtable简介 Hashtable同样是基于哈希表实现的,同样 每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中. Hashtable同样 实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆 . HashTable源码剖析 Hashtable的源码的很多实现都与HashMap差不多,源码如下(加入了比较详细的注

Java中HashTable和HashMap的区别

在Java中,HashTable和HashMap都是哈希表,那么它们有什么区别呢? 1.它们所继承的类不一样. HashTable和HashMap都实现了Map接口,但是它们所继承的类时不同的.HashTable继承了Dictionary类(Dictionary类已经过时),而HashMap则是继承了AbstractMap类.我们来看看它们的函数声明. HashTable声明: 1 public class Hashtable<K,V>extends Dictionary<K,V>

java中Hashtable中的t为什么是小写(转)

因为在很多年前刚学java的时候用到Hashtable的时候比较好奇为什么第二个t是小写,这不符合sun的风格啊,整个jdk都是标准驼峰,于是带着这个疑问翻过 很多书,看多很多资料,最后的结论是: Hashtable的第二个t小写是sun的失误,很多书都提到这个问题,很多人都给sun提过建议修改过来,后来sun也确实讨论过这个t的问题,但是由于Hashtable是jdk1.0的产物: 盲目的替换会导致很多老的系统根本无法兼容,于是sun决定保留这个小写的t,让它继续不合理的存在,当时没有太大的在

c# convert to java ,vector hashtable过时?

vector hashtable过时? 在用JAVA集合时,IDE提示 vector 以及hashtable被arraylist ,hashmap替代,而前者又是线程同步的,不知道为什么?是效率差了的原因? Map |--Hashtable:底层是哈希表数据结构,不可以存入null键null值.该集合是线程同步的.jdk1.0.效率低. |--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的.将hashtable替代,jdk1.2.效率高. |--T