转载请注明出处:https://blog.csdn.net/qq_28245087/article/details/89672796
在java项目开发中,有一个数据集合叫Hashtable,相信从事java开发的每一位朋友,的有所映象或使用过,那么小菜在这里谈一下我对hashMap的一些理解与小结。
LET'S GO!我们先来看看这些问题,你的知道或了解多少呢! 1、什么是Hashtable?2、Hashtable常用的接口方法有那些?3、Hashtable有那些构造方法?4、hashTable的成员变量有那些?5、Hashtable的初始长度是多少?6、为什么这样规定,设置这样的初始长度有什么意义?7、Hashtable的存储和读取?8、Hashtable的几种遍历方式?9、Hashtable和hashMap的区别有那些?那么,接下来,让我们带着这些问题往下看,GO
hashTable是基于哈希表的map接口的同步实现,它存储的数据都是键值对(key:value)映射,key和value的不允许存储null值,如遇到null值时会抛出空指针(NullPointExeeption)异常;key存储是唯一的,value的值可重复存储;hashTable存储的元素是无序的。
public class Hashtable
extends Dictionary
implements Map, Cloneable, java.io.Serializable{}
从以上源码可以看出,hashtable继承于Dictionary类,实现了 Map,Cloneable,Serializable接口;Dictionary可以将键值映射到相应的值的类的抽象父类,每个键值对都是一个对象。
1、clear() 的作用是清空Hashtable。它是将Hashtable的table数组的值全部设为null;来看看源码
2、contains() 和containsValue() 的作用都是判断Hashtable是否包含“值(value)”,返回true和false,如果值为null,会抛出空指针;来看看源码
3、containsKey() 的作用是判断Hashtable是否包含key,如果存在则返回true,没有则返回false;来看看源码
4、elements() 的作用是返回“所有value”的枚举对象;
5、get() 的作用就是获取key对应的value,没有的话返回null
6、put() 的作用是对外提供接口,让Hashtable对象可以通过put()将“key-value”添加到Hashtable中;
7、putAll() 的作用是将“Map(t)”的中全部元素逐一添加到Hashtable中;
8、remove的作用是就是删除hashtable中键为key的元素;
从源码中看出hashTale共提供了4个构造方法:
1、public Hashtable(int initialCapacity, float loadFactor): 用指定初始容量和指定加载因子构造一个新的空哈希表
2、public Hashtable(int initialCapacity):用来指定初始容量和默认的加载因子 (0.75) 构造一个新的空哈希表
3、public Hashtable():默认构造函数,容量为 11,加载因子为 0.75
4、public Hashtable(Map< ? extends K, ? extends V> t):构造一个与给定的Map具有相同映射关系的新哈希表
从源码中看出hashTale共提供了5个成员变量:
1、 table:一个Entry[]数组类型,而Entry(在 HashMap 中有讲解过)就是一个单向链表。哈希表的”key-value键值对”都是存储在Entry数组中的
2、count:Hashtable的大小,它是Hashtable保存的键值对的数量
3、threshold:Hashtable的阈值,用于判断是否需要调整Hashtable的容量,threshold的值 = (容量 * 负载因子)
4、loadFactor:负载因子
5、modCount:用来实现fail-fast机制的
hastable的初始长度为11;每一次扩容时,都是现在的容量*负载因子;负载因子等于0.75;
影响hashtable的实例性能的参数有两个,就是初始容量和加载因子。容量其实就是哈希表中桶的数量,初始容量就是哈希表中初始创建时的容量大小,在发生哈希冲突的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。加载因子是对哈希表在其容量自动增加之前能够连到多满的一个尺度。通常,默认加载因子是0.75,就是在空间和时间上录求一种折中。当加载因子过高时,虽然减少了空间的开锁,但同时也增加了某个条目的查找时间。
1、put():hashtable并不允许键和值为空(null)若设置为空值,会抛出空指针。HashMap计算的是h&(length-1),hashtable用的是模运算,效率上是低于hashMap的。hashtable计算索引时将hash值先与Ox7FFFFFF,这是为了保证hash值始终为正数,hashtable的方法都是加上关键字 synchronized的,也就是说这个hashtable是线程安全的;hashtable的每次扩容都是原来的2倍加1,而hashMap为原来的2倍。
2、get():根据传入的key值获取key对应的value值。如果传的值是null的话,会抛出空指针异常。
请看如下代码:
Hashtable table = new Hashtable<>();
table.put("abc", 12345);
table.put("bc", 125);
// 1、使用keys() 获取key值
Enumeration en1 = table.keys();
while (en1.hasMoreElements()) {
System.out.println(en1.nextElement());
}
// 2、使用elements() 获取value值
Enumeration
1、hashtable是线程安全的,hashMap不是线程安全的。
2、hashtable并不允许键和值为null,若为空会抛出空指针异常;hashMap则是可以 的,当调用遇到key为null的时候,调用putForNullKey方法进行处理,而对value没有处理。
3、hashtable和hashMap一样,不允许插入键一样的值,若插入一样的,则新的值会覆盖旧的值。
4、hashtable也是通过链表来解决冲突的。
5、hashtable的容量为任意正数(最小为1),hashMap的容量 始终为2的n次方;hashtable的容量默认为11,而hashMap的默认容量 为16。
6、hashTable每次扩容,新容量的是旧容量的2倍加1,而hashMap为旧容量的2倍。
注意:如果涉及到多线程同步时,建议使用hashTable;如果没有涉及到多线程同步时,建议使用hashMap;