hashtable、hashmap、ConcurrentHashMap、treemap的区别

本人原创,转载请注明出处! 本人QQ:530422429,欢迎大家指正、讨论。

欢迎访问: 西北工业大学 - 大数据与知识管理研究室 (Northwestern Polytechnical University - BigData and Knowledge Management Lab),链接:http://wowbigdata.cn/http://wowbigdata.net.cn/http://wowbigdata.com.cn


自己对hashtable、hashmap、treemap的理解,不知道是否有不对的地方。

HashTable: 

(1)是一个包含单向链的二维数组,table数组中是Entry<K,V>存储,entry对象;

 (2)放入的value不能为空;

 (3)线程安全的,所有方法均用synchronized修饰;

HashMap: (1)相当于HashTable的升级版本;

   (2)可以放入空值;

  (3)基于hash表实现;

  (4)按插入的顺序存储;

    (5)线程不安全;

ConcurrentHashMap: 通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费,慧眼独具的Doug Lee立马拿出了解决方案----ConcurrentHashMap。

(1)也是线程安全的,参考了博客http://blog.youkuaiyun.com/liuzhengkang/article/details/2916620

我觉得可以理解为 ConcurrentHashMap的一个segment相当于是一个HashTable;
ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。如图
 



TreeMap :(1)基于红黑树实现;

  (2)是有序的存储;

              (3)自己可以定义排序器;

HashMapHashtableTreeMap都是Java中用于存储键值对的集合类,但它们在多个方面存在区别: 1. **同步性**:HashMap不是同步的,任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致;而Hashtable是同步的,同一时刻只能有一个线程对其进行写操作,能保证线程安全。如果需要对HashMap进行同步,可以使用Collections的synchronizedMap方法或使用ConcurrentHashMap类[^1][^2]。 2. **键和值的支持**:HashMap支持null键和null值;Hashtable不允许null键和null值,否则会抛出NullPointerException;TreeMap不允许键为null,但值可以为null,如果插入null键会抛出NullPointerException [^1][^5]。 3. **性能**:通常情况下,HashMap进行put和get方法操作时可以达到常数时间的性能,是大部分利用键值对存取场景的首选;Hashtable由于是同步的,性能相对较低;TreeMap基于红黑树实现,put和get操作的时间复杂度是O(log n),适用于需要对键进行排序的场景 [^1]。 4. **迭代器**:HashMap使用Iterator进行迭代,并且其迭代器是fail-fast的,当有其它线程改变了HashMap的结构(增加或者移除元素),可能会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出此异常;Hashtable使用Enumeration进行迭代,不是fail-fast的 [^3][^4]。 5. **哈希数组默认大小和扩容方式**:Hashtable中hash数组默认大小是11,增加的方式是old * 2 + 1;HashMap中hash数组的默认大小是16,而且一定是2的指数 [^3]。 6. **排序**:HashMap不保证元素的顺序;Hashtable也不保证元素的顺序;TreeMap会根据键的自然顺序或指定的比较器对元素进行排序 [^1]。 以下是简单的代示例: ```java import java.util.HashMap; import java.util.Hashtable; import java.util.TreeMap; import java.util.Map; public class MapDifferenceExample { public static void main(String[] args) { // HashMap示例 Map<String, Integer> hashMap = new HashMap<>(); hashMap.put("One", 1); hashMap.put(null, 3); hashMap.put("Four", null); System.out.println("HashMap: " + hashMap); // Hashtable示例 Map<String, Integer> hashtable = new Hashtable<>(); hashtable.put("One", 1); // hashtable.put(null, 3); // 会抛出NullPointerException // hashtable.put("Four", null); // 会抛出NullPointerException System.out.println("Hashtable: " + hashtable); // TreeMap示例 Map<String, Integer> treeMap = new TreeMap<>(); treeMap.put("One", 1); // treeMap.put(null, 3); // 会抛出NullPointerException treeMap.put("Four", null); System.out.println("TreeMap: " + treeMap); } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值