HashMap 和 Hashtable 有哪些区别?
回答·22
最热
最新
- 1.HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。 2.hashtable,类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。 3.HashTable 中的主要方法,如 put,get,remove 和 rehash 等,与 HashMap 中的功能相同。
- 现在都问 HashMap 和 concurrentHashMap 的区别,HashTable 几乎弃用了
- 1、线程安全:Hashtable 线程安全,HashMap 不安全。 2、初始容量:HashMap 默认 16,Hashtable 默认 11。 3、扩容机制:HashMap 按照 2n 扩容,Hashtable 按照 2n+1 扩容。 4、底层原理:Hashtable 是数组和链表,HashMap 是数组,链表,红黑树(jdk1.7,jdk1.8)。 5、null 元素:HashMap 允许 null 作为 key 和 value,Hashtable 不允许。
- HashMap 几乎可以等价于 Hashtable,除了 HashMap 是非 synchronized 的,并可以接受 null(HashMap 可以接受为 null 的键值(key)和值(value),而 Hashtable 则不行)。 HashMap 是非 synchronized,而 Hashtable 是 synchronized,这意味着 Hashtable 是线程安全的,多个线程可以共享一个 Hashtable;而如果没有正确的同步的话,多个线程是不能共享 HashMap 的。Java 5 提供了 ConcurrentHashMap,它是 HashTable 的替代,比 HashTable 的扩展性更好。 另一个区别是 HashMap 的迭代器(Iterator)是 fail-fast 迭代器,而 Hashtable 的 enumerator 迭代器不是 fail-fast 的。所以当有其它线程改变了 HashMap 的结构(增加或者移除元素),将会抛出 ConcurrentModificationException,但迭代器本身的 remove()方法移除元素则不会抛出 ConcurrentModificationException 异常。但这并不是一个一定发生的行为,要看 JVM。这条同样也是 Enumeration 和 Iterator 的区别。 由于 Hashtable 是线程安全的也是 synchronized,所以在单线程环境下它比 HashMap 要慢。如果你不需要同步,只需要单一线程,那么使用 HashMap 性能要好过 Hashtable。 HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的。 HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因为 contains 方法容易让人引起误解。 Hashtable 中 hash 数值默认值的大小是 11,增加的方式是 old*2+1,HashMap 中 hash 值得默认大小是 16,而且一定是 2 的指数。
- hashmap 映射,hashtable 字典
- 从线程安全角度来说,hashtable 是线程安全的,hashmap 线程不安全 从效率角度来说,hashmap 效率高于 hashtable 从版本上来说,hashtable 出现于 jdk1.0,hashmap 出现于 jdk1.2 虽说 hshmap 不安全,但是有 currenthashmap 是安全的呀。。。
- HashTable 是线程安全的,而 hashmap 是非线程安全的。
- 内部实现有细微差别 hashtable 主要是 c++的字典直接搬过来,hashtable 的写 synchronized 是方法锁,大致写时锁的整块儿 hash 的碰撞地方,现在多线程下一般用 currenthashmap,是块级锁只锁写时的具体碰撞点所以性能捎高点,hashmap 无锁肯定最高不过没锁在有并发的情况下如果有写操作有安全性问题,具体你代码里点击进去看下源码更清晰。
- 像我觉得这种的话已经淘汰了 API 没必要去对比。个人意见哈。反正又不会用 hashtable。 后者是一个很古老的线程安全的集合。从这里可以 jdk1.0 1.1 左右好像就有了。当时设计的太早,可能考虑的不是很周全,所以性能不怎么好。就是用 synchronized 的关键字保证了安全。现在绝对不会用这个集合。如果你看到项目中有的话,那说明这个项目很老了。保留这个 APP 的原因也是因为。之前很多老项目用这个要向上兼容。删掉的话,以前的老项目就会出错。所以保留了,但是新的项目都不会用它开发。 还行 hashmap 非线程安全。但是性能很优秀。是我们常用的。如果要用按线程安全。可以用工具类把它包装成线程安全的集合。也可以直接用 juc 包下的线程安全的 concurrenhashmap。 个人觉得哈,没必要去对比这个东西了,因为他既然已经淘汰了。反正你后面怎么都不会去用。用也是用新的 API。
- 没区别,都一样,都是属于 c++的东西