黑马程序员技术交流社区

标题: HashMap和HashTable的区别? [打印本页]

作者: 温立华    时间: 2013-3-18 21:45
标题: HashMap和HashTable的区别?
本帖最后由 温立华 于 2013-3-20 10:08 编辑

HashMap和HashTable的区别?

作者: 刘松老师    时间: 2013-3-18 21:53
hashtable:是jdk1.0的,底层是哈希表数据结构,不可以存入null键null值,是线程同步的
hashmap:是jdk1.2的,底层是哈希表数据结构,可以存在null键null值,是线程不同步的,效率高
作者: HM赵磊    时间: 2013-3-18 22:03
本帖最后由 HM赵磊 于 2013-3-18 22:06 编辑

Hashtable:她的底层使用的数据结构是哈希表,在所存的元素中,键不能为Null,值也不能为null,这个集合是线程同步的,所以效率比较低,她出现在jdk1.0。但是这面有一个比较牛的子类Properties,这个类一般和XML一样存储一些配置信息,在后面的IO流中,会用到的比较多。
HashMap:她的底层使用的数据结构也是哈希表,但是他允许存入空键和空值,这个集合不是同步的,所以效率会比Hashtable高,她从jdk1.2开始出现。在开发和使用的过程中,一般情况下使用HashMap的会比较多
作者: 飞天小猪猪    时间: 2013-3-18 22:08
Hashtable:底层是哈希表数据结构,不可以存入null键null值。集合是线程同步的,在jdk1.0时出现 效率低
HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的,将Hashtable替代,是jdk2.0出现的,效率高
作者: 王龙涛    时间: 2013-3-18 22:25
1 HashMap不是线程安全的
            hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。
2   HashTable是线程安全的一个Collection。
           HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
         
作者: 黑马-蒋振军    时间: 2013-3-18 22:43
Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap,而最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap) 希望可以帮到你
作者: 黑马17期-闫东东    时间: 2013-3-19 00:07
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
|--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代
作者: HM李超    时间: 2013-3-19 01:24
    这类的问题我最喜欢回答了,因为没什么技术含量,楼主只要肯动手查工具答案就知晓了,既然发在这里,我就回答了:
    HashMap和Hashtable都是Map接口的实现类,它们之间的关系完全类似于ArrayList和Vetor的关系:hashtable是一个比较老的Map实现类,在JDK1.0中就存在了,那时候还没有Map接口,它包含2个烦琐的方法:elements方法和keys方法(至于为什么烦琐,我目前也不是很清楚,但是这么说了,我就尽量不用),现在很少使用了。此外,还有2个典型的区别:
    1,Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的,所以HashMap比Hashtable的性能稍高一点,但如果有多条线程访问同一个Map对象时,Hashtable实现类会更好。
    2,Hashtable不允许使用null作为key和value,如果试图把null值放进Hashtable中,将会引发NullPointerException异常,但HashMap里最多可以使用null作为key或者value。
作者: 聂斌    时间: 2013-3-19 02:04
本帖最后由 聂斌 于 2013-3-19 02:05 编辑

|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现hashCode 方法和 equals 方法。


|--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。除了非同步和允许使用 null 之外,HashMap 类与Hashtable 大致相同。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 键和值都是对象,并且不能包含重复键,但可以包含重复值 ,,,

还有些不同点:
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
HashTable使用Enumeration,HashMap使用Iterator。



另外注意下HashMap 对null的处理:
代码:

                Map<String,String> map = new HashMap<String,String>();


                map.put(null, "sdsd");     //这里可以存key为null,,,,"sdsd")换为null也可以,,,,HashMap集合null是可以作为key存在的,,可以map.put(null, null);get(null)时也返null,,

                System.out.println(map.get(null));   //get也可以用null作为key,,如果"sdsd"改为null那么这里也返回null,,,
输出:sdsd



作者: 小路飞    时间: 2013-3-19 07:55
就像老师在视频中说的两者区别主要在于:Hashtable不可以存入null键和null值,线程同步,效率低;HashMap 可以存入null键和null值,线程不同步,效率高。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2