A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 温立华 中级黑马   /  2013-3-18 21:45  /  1698 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 温立华 于 2013-3-20 10:08 编辑

HashMap和HashTable的区别?

点评

多看看毕老师的视频,上面讲解的很清楚的。  发表于 2013-3-18 22:24

评分

参与人数 2技术分 +1 黑马币 +9 收起 理由
猫腻 + 1
黄玉昆 + 9

查看全部评分

9 个回复

正序浏览
小路飞 来自手机 中级黑马 2013-3-19 07:55:38
10#
就像老师在视频中说的两者区别主要在于:Hashtable不可以存入null键和null值,线程同步,效率低;HashMap 可以存入null键和null值,线程不同步,效率高。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
聂斌 中级黑马 2013-3-19 02:04:27
9#
本帖最后由 聂斌 于 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


评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
    这类的问题我最喜欢回答了,因为没什么技术含量,楼主只要肯动手查工具答案就知晓了,既然发在这里,我就回答了:
    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。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
|--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代
回复 使用道具 举报
Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap,而最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap) 希望可以帮到你

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
1 HashMap不是线程安全的
            hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。
2   HashTable是线程安全的一个Collection。
           HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
         

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
Hashtable:底层是哈希表数据结构,不可以存入null键null值。集合是线程同步的,在jdk1.0时出现 效率低
HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的,将Hashtable替代,是jdk2.0出现的,效率高

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 HM赵磊 于 2013-3-18 22:06 编辑

Hashtable:她的底层使用的数据结构是哈希表,在所存的元素中,键不能为Null,值也不能为null,这个集合是线程同步的,所以效率比较低,她出现在jdk1.0。但是这面有一个比较牛的子类Properties,这个类一般和XML一样存储一些配置信息,在后面的IO流中,会用到的比较多。
HashMap:她的底层使用的数据结构也是哈希表,但是他允许存入空键和空值,这个集合不是同步的,所以效率会比Hashtable高,她从jdk1.2开始出现。在开发和使用的过程中,一般情况下使用HashMap的会比较多

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
hashtable:是jdk1.0的,底层是哈希表数据结构,不可以存入null键null值,是线程同步的
hashmap:是jdk1.2的,底层是哈希表数据结构,可以存在null键null值,是线程不同步的,效率高

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马