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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周星星 注册黑马   /  2012-6-19 09:37  /  2631 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这是我参加上海泛微软件的一道笔试题,和大家共享一下

11 个回复

倒序浏览
HashMap不是线程安全的  也就是不同步的  容许key和value为null
HashTable是线程安全的  也就是同步的    key和value不能为null


回复 使用道具 举报
hashmap允许添加NULL键和null值,线程不同步,效率略高;
hashtable不允许添加null键和null值,线程同步,效率略低。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
回复 使用道具 举报
两者底层都是哈希数据结构 ,但是HashTable 不可以存入Null键和Null值, 且该集合是线程同步
                            HashMap 允许Null键和Null值, 是线程不同步。
回复 使用道具 举报
Hastmap是一个map接口的子接口, 是基于哈希表的 Map 接口的实现
Hashtable继承自Dictionary类
HashMap允许将null作为一个输入的key或者value,而Hashtable不允许
在HashMap中,null可以作为键;
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
HashMap可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
回复 使用道具 举报
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

两句话总结:
HashMap => 不同步、空键值、效率高;
Hashtable => 同步、非空键值、效率略低
回复 使用道具 举报
本帖最后由 胡大强 于 2012-6-19 10:32 编辑
胡大强 发表于 2012-6-19 10:22
Hastmap是一个map接口的子接口, 是基于哈希表的 Map 接口的实现
Hashtable继承自Dictionary类
HashMap允许 ...



举个例子:
HashMap map = new HashMap();
map.put("Null", null);

   map.put(null, "Null");
   map.put(null, "Empty");

   System.out.println(map.get(null));

   System.out.println(map.get("Null"));  //Null对应的为null,返回null

   System.out.println(map.get("java"));  //没有java键值,返回null

   System.out.println(map.containsKey("Null"));

输出的是:

Empty

null

null

true
回复 使用道具 举报
郑冬 中级黑马 2012-6-19 10:35:33
8#
Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
   第二点不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的 HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。
  第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的 key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回 null。如果有必要,用containKey()方法来区别这两种情况。
回复 使用道具 举报
不错噢,很全面
回复 使用道具 举报
  |---HashTable:底层是哈希表,不可以出现null的健和值(线程同步)

|---HashMap:底层是哈希表,可以出现null的健和值(线程不同步)

回复 使用道具 举报
1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;
2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,

则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:
Map Collections.synchronizedMap(Map m)
这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
3.在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对

应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
这个嘛:你百度一下。灰常详细
回复 使用道具 举报
HashMap 和Hashtable的区别有:

1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

4.HashTable使用Enumeration,HashMap使用Iterator。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。

5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);

static int hash(Object x) {
  int h = x.hashCode();

  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);
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马