- 浏览: 152188 次
- 性别:
- 来自: 湖南
文章分类
最新评论
-
viking_wu:
Android POST方式提交数据 -
hsiunien:
不能正常调用 init android4.3上 是否可以 ...
Android JS双向调用 -
liaokang.java:
Apple.Chen 写道你确定这是插入排序而不是冒泡?插入排 ...
java之插入排序 -
Apple.Chen:
你确定这是插入排序而不是冒泡?
java之插入排序 -
ct19900913:
顶一个!!!
Android ContentProvider共享数据
1.先说继承关系吧
Java代码
public class Hashtable< k,v> extends Dictionary< k,v> implements Map< k,v>, Cloneable, java.io.Serializable {…} public class HashMap< k,v> extends AbstractMap< k,v> implements Map< k,v>, Cloneable, Serializable {…}
可以看到hashtable也是继承了Map接口。它们的不同是Hashtable(since JDK1.0)就继承了Dictionary这个抽象类,而HashMap(since JDK1.2)继承的则是AbstractMap这个抽象类。因为在Hashtable中看到继承Map后所实现的方法是JDK1.2版本时加上去的,所以可能是在JDK 1.2开发时Sun工程师出于统一的考虑使得Hashtable也继承了Map接口。
2.我们从同步和并发性上来说说它们两个的不同。
可以通过这两个类得源码来分析,Hashtable中的主要方法都做了同步处理,而HashMap则没有。可以说Hashtable在默认情况支持 同步,而HashMap在默认情况下是不支持的。我们在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加 同步处理了。对HashMap的同步处理可以使用Collections类提供的synchronizedMap静态方法;或者直接使用JDK5.0之后 提供的java.util.concurrent包里的ConcurrentHashMap类。
3.它们对于null值的处理方式了
我们依然能够从源代码中得知,Hashtable中,key和value都不允许出现null值。
在我们使用上面的方法时,如参数value为null,可以从代码中直接看出程序会抛出NullPointerException;而在key为 null时,则会在“int hash = key.hashCode();“这段计算Hash值的过程中抛出NullPointerException。而在在HashMap中,允许null作为 key存在,并且和其他key的特性一样,这样的null值key只能有一个;另外HashMap允许多个value为null。这样大家就要注意了, HashMap中就不能用get(key)方法来判断HashMap中是否存在某个key,因为value为null和不存在该key的Entry都会返 回null值,而应该用containsKey()方法来判断了。
结果
4.hash值的获取方式
还是通过源代码源代码,Hashtable是直接使用key对象的hash值。
而HashMap则是利用key对象的hash值重新计算一个新的hash值。
本文是从网上一篇比较有趣的帖子上转载而来,原文链接
http://www.java3z.com/cwbwebhome/article/article8/81437.html?id=4314
Java代码
public class Hashtable< k,v> extends Dictionary< k,v> implements Map< k,v>, Cloneable, java.io.Serializable {…} public class HashMap< k,v> extends AbstractMap< k,v> implements Map< k,v>, Cloneable, Serializable {…}
可以看到hashtable也是继承了Map接口。它们的不同是Hashtable(since JDK1.0)就继承了Dictionary这个抽象类,而HashMap(since JDK1.2)继承的则是AbstractMap这个抽象类。因为在Hashtable中看到继承Map后所实现的方法是JDK1.2版本时加上去的,所以可能是在JDK 1.2开发时Sun工程师出于统一的考虑使得Hashtable也继承了Map接口。
2.我们从同步和并发性上来说说它们两个的不同。
可以通过这两个类得源码来分析,Hashtable中的主要方法都做了同步处理,而HashMap则没有。可以说Hashtable在默认情况支持 同步,而HashMap在默认情况下是不支持的。我们在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加 同步处理了。对HashMap的同步处理可以使用Collections类提供的synchronizedMap静态方法;或者直接使用JDK5.0之后 提供的java.util.concurrent包里的ConcurrentHashMap类。
3.它们对于null值的处理方式了
我们依然能够从源代码中得知,Hashtable中,key和value都不允许出现null值。
public synchronized V put(K key, V value) { // 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; //… }
在我们使用上面的方法时,如参数value为null,可以从代码中直接看出程序会抛出NullPointerException;而在key为 null时,则会在“int hash = key.hashCode();“这段计算Hash值的过程中抛出NullPointerException。而在在HashMap中,允许null作为 key存在,并且和其他key的特性一样,这样的null值key只能有一个;另外HashMap允许多个value为null。这样大家就要注意了, HashMap中就不能用get(key)方法来判断HashMap中是否存在某个key,因为value为null和不存在该key的Entry都会返 回null值,而应该用containsKey()方法来判断了。
import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class TestCase { public static void main(String[] args) { Map< integer,string> hashMap = new HashMap< integer,string>(); hashMap.put(0, null); hashMap.put(1, "one"); hashMap.put(2, "two"); hashMap.put(null, "null"); for(Entry< integer, string> e : hashMap.entrySet()) { System.out.println("Key: " + e.getKey() + " -- Value: " + e.getValue()); } System.out.println(hashMap.get(0)); System.out.println(hashMap.get(4)); System.out.println("Contains key 0 ? :" + hashMap.containsKey(0)); System.out.println("Contains key 4 ? :" + hashMap.containsKey(4)); System.out.println("Contains value null ? :" + hashMap.containsValue(null)); } }
结果
Key: null -- Value: null Key: 0 -- Value: null Key: 1 -- Value: one Key: 2 -- Value: two null null Contains key 0 ? :true Contains key 4 ? :false Contains value null ? :true
4.hash值的获取方式
还是通过源代码源代码,Hashtable是直接使用key对象的hash值。
public synchronized V put(K key, V value) { // 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();//hashcode int index = (hash & 0x7FFFFFFF) % tab.length; //… }
而HashMap则是利用key对象的hash值重新计算一个新的hash值。
public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode());//hashcode int i = indexFor(hash, table.length); //… } static int hash(int h) { h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }
本文是从网上一篇比较有趣的帖子上转载而来,原文链接
http://www.java3z.com/cwbwebhome/article/article8/81437.html?id=4314
发表评论
-
java自定义Annotation
2013-08-23 11:41 921自定义Annotation概念篇 来看一个最简单的annota ... -
JBPM安装和配置
2012-09-10 21:30 4451在介绍JBPM的安装之前可能有人会问,JBPM不是说它 ... -
java NIO
2011-09-26 10:25 1296原有的I/O操作都是以字节为单位进行读写的,虽然应用时 ... -
java多线程下载网络资源
2011-09-09 10:43 1379在java中,我们可以通过URL和HttpURLConnect ... -
java方法参数是引用调用还是值调用
2011-08-19 14:17 965方法调用(call by) 是一个标准的计算机科学术语 ... -
HashSet介绍
2011-08-18 21:35 903(1) 为啥要用HahSet? 假如我们现在想要在一大 ... -
java日期转化"BUG"
2011-08-05 16:43 961最近看了一个有意思的帖子,拿来分享一下 SimpleDa ... -
java之网络编程
2011-08-03 11:12 992提到java的网络编程,大家肯定会想到TCP,UDP协议,下面 ... -
java虚拟机基础知识
2011-06-22 10:35 11031.java虚拟机与程序的生命周期 在如下几种情况下,java ... -
HashMap底层的实现
2011-06-20 13:20 7387首先我们来看看HashMap的底层源码 /** ... -
java动态代理分析
2011-06-07 12:48 8671.所谓动态代理类是这样一种class,首先它是在运行期生成的 ... -
TreeSet分析
2011-06-04 21:08 9881. |——SortedSet接口——TreeSe ... -
equals和hashCode方法分析
2011-06-04 17:51 9111.HashSet存放的是无序,不能重复的对象,当添加一个对象 ... -
ArrayList与LinkedList分析
2011-06-04 11:49 951先看看ArrayList源码 public class A ... -
java的克隆
2011-05-08 22:02 986所谓复制就是将一份东西拷贝一份,在java中有浅复制和深复制的 ... -
java线程通信
2011-05-08 16:39 745一说到线程通信我们就会想到生产者和消费者,哲学家就餐问题,下面 ... -
java多线程及synchronized
2011-05-08 13:31 594通常我们所说的程序它只是一个静态的概念,而进程是其动态性的体现 ... -
java反射机制2
2011-05-06 08:55 862package com.lamp.test; pub ... -
java反射机制
2011-05-05 19:47 954反射是java一大特征,没有它java体现不出它那些优点,更别 ... -
JPA及联合主键的使用
2011-04-26 20:07 1563JPA全称为java persistence AP ...
相关推荐
记得刚毕业那会准备面试,看过不少面试题,里面有个说出HashMap和HashTable不同的题目,我那会面试的时候也遇到不少次这个问题,还隐约记得当时的回答是这样的: HashTable是比较旧的版本;HashTable是线程安全的,...
hashMap和hashTable的区别,大家可以下载学习学习。
Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结
初级程序员面试经常问道的问题,HashMap与HashTable区别,希望有帮助
HashTable不支持空键值对! 而HashMap支持空键值对!
hashmap与hashtable区别 主要是应用于存值的数值对
hashmap和hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。 1. HashMap几乎可以等价于Hashtable,...
HashMap、HashTable和HashSet是Java中常用的数据结构,它们的底层实现原理以及区别如下:HashMap底层实现原理: HashMap基于哈希表(HashTable)实现,它通过散列算法将键值对映射到数组中。在HashMap中,每个键值对...
hashmap和hashtable的区别
HashMap和Hashtable都实现了Map接口 B. HashMap是非synchronized,而Hashtable是synchronized C. HashTable使用Enumeration,HashMap使用Iterator D. HashMap允许将 null 作为一个 entry 的 key 或者 value,而 ...
今天小编就为大家分享一篇关于HashMap和HashTable底层原理以及常见面试题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
hashMap和Hashtable的区别1
11.HashMap和HashTable的区别.avi
NULL 博文链接:https://qiaolevip.iteye.com/blog/2094447
HashMap和Hashtable的区别Java开发Java经验技巧共2页.pdf.zip
HashMap和HashTable区别共2页.pdf.zip
本文主要介绍HashMap 和 Hashtable的区别,这里整理了相关资料并详细介绍了HashMap 和 Hashtable的区别及其工作原理和使用方法,有需要的朋友可以看一下
Java面试题11.HashMap和HashTable的区别.mp4
比较分析Vector、ArrayList和hashtable hashmap数据结构
经典讲解List和ArrayList和Vector和HashTable和HashMap区别