首页 > 试题广场 >

关于HashMap和Hashtable正确的说法有()

[不定项选择题]
关于HashMap和Hashtable正确的说法有()
  • 都实现了Map接口
  • Hashtable类不是同步的,而HashMap类是同步的
  • Hashtable不允许null键或值
  • HashMap不允许null键或值

1、继承不同。public class Hashtable extends Dictionary implements Map

 public class HashMap extends AbstractMap implements Map

2、Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。

3、Hashtable中,key和value都不允许出现null值。

在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

4、两个遍历方式的内部实现上不同。

Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

5、哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

6Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数 

发表于 2017-08-02 09:54:05 回复(15)

Collection

    -----List

               -----LinkedList    非同步

                ----ArrayList      非同步,实现了可变大小的元素数组

                ----Vector          同步           

    -----Set   不允许有相同的元素

 Map

    -----HashTable        同步,实现一个key--value映射的哈希表,key和value都不允许出现null值

    -----HashMap          非同步,

    -----WeakHashMap   改进的HashMap,实现了弱引用,如果一个key不被引用,则被GC回收
注:

List接口中的对象按一定顺序排列,允许重复 
Set接口中的对象没有顺序,但是不允许重复 
Map接口中的对象是key、value的映射关系,key不允许重复

编辑于 2017-08-25 15:55:29 回复(4)
总结一下HashMap和Hashtable的区别:
    (1)HashMap是Hashtable的轻量级实现,它们都实现了Map接口,主要区别在于HashMap允许空(null)键值(key),而Hashtalbe不允许
    (2)HashMap没有contains方法,而是containsValue和containsKey
    (3)Hashtable的方法是线程安全的,而HashMap不是线程安全的。
    (4)HashMap使用Iterator,Hashtable使用Enumeration。
    (5)HashMap和Hashtable采用的hash/rehash算法都几乎一样,所以性能不会有很大的差异。
    (6)在Hashtable中,hash数组默认大小是11,增加的方式是old*2+1。在Has和Map中,hash数组的默认大小是16,而且一定是2的倍数。
    (7)hash值的使用不同,Hashtable直接使用对象的hashCode。
发表于 2018-06-26 09:47:30 回复(1)
两者都是实现了Map接口,HashMap不是同步的,Hashtable是同步的(内部除构造方法以外的所有方法都加了sychronized关键字来保证同步),另外HashMap允许至多有一个null的key值,null值的value则是几个都随意,但是Hashtable则是不允许null键或者null的value出现,打完收工!
发表于 2017-08-08 22:11:05 回复(0)
看看继承体系
然后HashMap可以允许Null做键或者值,但是Null的键 只能有一个

这个表上的知识能够让你明白个体系,但是具体我们看看HashMap的码源吧
1.都实现了map接口
public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
2.Hashtable的主要方法都是同步方法
 public synchronized V put(K key, V value) 
 public synchronized V get(Object key)
所以Hashtable是线程安全的
HashMap的主要方法
public V put(K key, V value)
public V get(Object key)
3.是否允许控制这个问题看看码源
Hashtable中不允许空值存在
 if (value == null) {
            throw new NullPointerException();
   }
然而HashMap通过码源检查发现
 if (key == null)
            return putForNullKey(value);
允许null作为键或者值
由于key-value形式,所以只能有一个Null的key
4.关于hash值的问题
HashMap将hash值重新计算是一个
 final int hash(Object k) {
        int h = hashSeed;
        if (0 != h && k instanceof String) {
            return sun.misc.Hashing.stringHash32((String) k);
        }

        h ^= k.hashCode();

        // This function ensures that hashCodes that differ only by
        // constant multiples at each bit position have a bounded
        // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }
这样的方法,进行哈希运算,新的hash值
而Hashtable采取的是
 int hash = key.hashCode();的方式进行计算
5.关于扩容问题HashMap采取直接扩大两倍,初始长度16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
 public HashMap(Map<? extends K, ? extends V> m) {
        this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1,
                      DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);
        inflateTable(threshold);

        putAllForCreate(m);
    }

 if ((size >= threshold) && (null != table[bucketIndex])) {
            resize(2 * table.length);
            hash = (null != key) ? hash(key) : 0;
            bucketIndex = indexFor(hash, table.length);
        }
而HashTable的策略是乘以2增长,初始11
public Hashtable(Map<? extends K, ? extends V> t) {
        this(Math.max(2*t.size(), 11), 0.75f);
        putAll(t);
    }







编辑于 2018-10-18 11:08:34 回复(0)
(1)HashMap是Hashtable的轻量级实现,它们都实现了Map接口,主要区别在于HashMap允许空(null)键值(key),而Hashtalbe不允许。     (2)HashMap没有contains方法,而是containsValue和containsKey。     (3)Hashtable的方法是线程安全的,而HashMap不是线程安全的。     (4)HashMap使用Iterator,Hashtable使用Enumeration。     (5)HashMap和Hashtable采用的hash/rehash算法都几乎一样,所以性能不会有很大的差异。     (6)在Hashtable中,hash数组默认大小是11,增加的方式是old*2+1。在Has和Map中,hash数组的默认大小是16,而且一定是2的倍数。     (7)hash值的使用不同,Hashtable直接使用对象的hashCode。
发表于 2021-11-03 22:14:30 回复(0)
  • A(√):两者都实现了Map接口
    public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
    public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable
  • B(X):HashMap不同步,HashTable使用监视器锁 synchronized 同步,错
    图片说明
  • C(√):HashTable在 put 时 key/value 为 null 直接抛空指针异常
    图片说明
  • D(X):HashMap 允许 null 做键值
发表于 2021-04-08 10:43:31 回复(0)
//HashMap的源码
public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable{
 //HashMap的put方法,没有同步
 public V put(K key, V value){ 
  ...
  if (key == null)
   return putForNullKey(value);
  ...
 }
 
 //以下是HashMap中的方法,注意,没有contains方法
 public boolean containsKey(Object key) {...}
 public boolean containsValue(Object value){...}
 
}
//Hashtable的源码
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable{
 //Hashtable的put方法
 //当然,Hashtable的其他方法,如get,size,remove等方法,
 //都加了synchronized关键词同步操作
 public synchronized V put(K key, V value){
  ...
  if (value == null) {
      throw new NullPointerException();
  }
  ...
 }
 //以下是Hashtable的方法
 public synchronized boolean contains(Object value);
 public synchronized boolean containsKey(Object key);
 public boolean containsValue(Object value);
}

编辑于 2017-08-01 11:24:23 回复(0)
C
从Java 2 平台 v1.2起,Hashtable被改进以实现 Map 接口。

HashMap Hashtable 的区别


  • Hashtable 是线程安全的
  • Hashtable 不允许使用 null 作为 key value HashMap 允许
  • 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。


发表于 2017-02-14 00:08:42 回复(0)
HashMap和Hashtable都实现了Map接口;
Hashtable不允许null键或值。
发表于 2021-07-24 16:05:06 回复(0)
编辑于 2021-04-08 10:36:28 回复(0)
hashmap允许且只允许一个null值
发表于 2023-02-24 15:00:09 回复(0)
两者都属于键与值的映射,因此都继承自Map,HashTable底层由数组+链表实现,synchronized修饰方法,是线程安全的。但不建议使用。HashMap非线程安全。
发表于 2022-02-01 20:05:37 回复(0)
记错了HashMap允许空值空键
发表于 2021-10-31 20:32:26 回复(0)
Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的
发表于 2021-08-09 13:28:36 回复(0)
hashtable不允许null
编辑于 2024-02-15 00:10:10 回复(0)
hashmap后出的,去掉了线程安全,性能更好(一般使用下),null可以作为key和value,hashtable则不能。
发表于 2022-11-26 20:12:29 回复(0)
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable
发表于 2022-11-16 16:12:27 回复(0)
①都实现了map接口 ②Hashtable是同步的,HashMap在缺省情况下是非同步的 ③Hashtable不允许null键值对,HashMap只允许一个键为null。
编辑于 2022-08-29 16:47:15 回复(0)
复制mark (1)HashMap是Hashtable的轻量级实现,它们都实现了Map接口,主要区别在于HashMap允许空(null)键值(key),而Hashtalbe不允许。     (2)HashMap没有contains方法,而是containsValue和containsKey。     (3)Hashtable的方法是线程安全的,而HashMap不是线程安全的。     (4)HashMap使用Iterator,Hashtable使用Enumeration。     (5)HashMap和Hashtable采用的hash/rehash算法都几乎一样,所以性能不会有很大的差异。     (6)在Hashtable中,hash数组默认大小是11,增加的方式是old*2+1。在Has和Map中,hash数组的默认大小是16,而且一定是2的倍数。     (7)hash值的使用不同,Hashtable直接使用对象的hashCode。
发表于 2022-03-01 00:29:04 回复(0)