Java中hashmap和hashtable的区别
引导语:HashMap 和HashSet 是Java Collection Framework 的两个重要成员,其中 HashMap 是Map 接口的常用实现类,HashSet 是Set 接口的常用实现类。以下是本站小编分享给大家的Java中hashmap和hashtable的区别,欢迎阅读!
1、 继承和实现区别
Hashtable是基于陈旧的Dictionary类,完成了Map接口;HashMap是Java 1.2引进的`Map接口的一个实现(HashMap继承于AbstractMap,AbstractMap完成了Map接口)。
2、 线程安全不同
HashTable的方法是同步的,HashMap是未同步,所以在多线程场合要手动同步HashMap。
3、 对null的处理不同
HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。即 HashTable不允许null值其实在编译期不会有任何的不一样,会照样执行,只是在运行期的时候Hashtable中设置的话回出现空指针异常。 HashMap允许null值是指可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
4、 方法不同
HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
5、HashTable使用Enumeration,HashMap使用Iterator。
6、HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
7、哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = Code();
int index = (hash & 0x7FFFFFFF) % th;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, th);
static int hash(Object x) {
int h = Code();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}
区别 | Hashtable | Hashmap |
继承、实现 | Hashtable | HashMap |
线程同步 | 已经同步过的可以安全使用 | 未同步的,可以使用Colletcions进行同步Map |
对null的处理 | Hashtable table = new Hashtable(); (null, "Null"); ("Null", null); ains(null); ainsKey(null); ainsValue(null); 后面的5句话在编译的时候不会有异常,可在运行的时候会报空指针异常具体原因可以查看源代码 public synchronized V put(K key, V value) { } | HashMap map = new HashMap(); ("Null", null); ainsKey(null); ainsValue(null); 以上这5条语句无论在编译期,还是在运行期都是没有错误的. 在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。 |
增长率 | void addEntry(int hash, K key, V value, int bucketIndex) { | |
哈希值的使用 | HashTable直接使用对象的hashCode,代码是这样的: publicsynchronizedbooleancontainsKey(Object key) { | HashMap重新计算hash值,而且用与代替求模 |
-
Java常用数据结构及类
Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。本文特意为大家收集整理了Java常用数据结构及类,希望大家喜欢!一、Vector类Vector类似于一个数组,但与数组相比在使用上有以下两个优点。1、使用的时候无需声明上限,随着元素的增加,Vec...
-
关于Java程序员面试中的多线程问题总结
很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(CollectionsFramework),理解核心线程概念时,娴熟的实际经验是必需的。这篇文章收集了Java线程方面一些典型的问题,这些问题经常被高级工程师所问到。0、Java中多线程同步是什么?在多线程程序下,同步能控...
-
Java中运算符的使用
导语:计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。下面是java中运算符的使用,一起来学习下吧:算术运算符单目:+(取正)-(取负)++(自增1)--(自减1)双目:+-*/%(取余)三目:a>b?true:false说明:当a大于b的时候,为tru...
-
java日期时间基本操作方法
1.获得Calendar实例:Calendarc=nstance();2.定义日期/时间的格式:SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");3.把日期/时间转换成固定格式,使用SimpleDateFormat的'format()方法:Stringdatetime=at(ime());4.把字符串转换成日期/时间,...
相关文章
- php函数method-exists()与is-callable()有何区别
- The Best Thing That Could Ever Happen少儿双语阅读
- 深入PHP中的HashTable结构详解
- 对Java中HashMap和TreeMap的区别的深入理解
- 深入解析hashmap,java实现原理
- Javascript实例教程如何使用HoTMetal
- 圣诞节英语诗歌《We Won't Have a Christmas This Year》
- 关于php中hashtable实现示例
- java环境变量path和classpath的配置过程
- java使用ConcurrentHashMap和计数器实现锁的方法