刚开始看到HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的。于是自己搜索了一些相关资料来学习,以下就是我的学习沉淀。

java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类。Map是将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射一个一个值。

Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力.

Hashtable 与 HashMap类似,但是主要有6点不同。

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

2.HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许 key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。

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

4.HashTable使用Enumeration,HashMap使用Iterator。

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

6.哈希值的使用不同,HashTable直接使用对象的hashCode。

TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

下面是HashTable,HashMap和TreeMap总结的一个经典例子。

    package com.taobao.luxiaoting;  

    import java.util.Map;     

    import java.util.HashMap;     

    import java.util.Set;     

    import java.util.HashSet;     

    import java.util.Iterator;     

    import java.util.Hashtable;     

    import java.util.TreeMap;     

    class  HashMaps     

    {     

           public static void main(String[] args)      

          {     

                Map map=new HashMap();                 

                map.put(“a”, “aaa”);     

                map.put(“b”, “bbb”);     

                map.put(“c”, “ccc”);     

                map.put(“d”, “ddd”);     

                Iterator iterator = map.keySet().iterator();                 

                while (iterator.hasNext()) {     

                 Object key = iterator.next();     

                 System.out.println(“map.get(key) is :”+map.get(key));     

                }           

                Hashtable tab=new Hashtable();                 

                tab.put(“a”, “aaa”);     

                tab.put(“b”, “bbb”);     

                tab.put(“c”, “ccc”);     

                tab.put(“d”, “ddd”);     

                Iterator iterator_1 = tab.keySet().iterator();     

                while (iterator_1.hasNext()) {     

                 Object key = iterator_1.next();     

                 System.out.println(“tab.get(key) is :”+tab.get(key));     

                }              

                TreeMap tmp=new TreeMap();                 

                tmp.put(“a”, “aaa”);     

                tmp.put(“b”, “bbb”);     

                tmp.put(“c”, “ccc”);     

                tmp.put(“d”, “ddd”);     

                Iterator iterator_2 = tmp.keySet().iterator();     

                while (iterator_2.hasNext()) {     

                 Object key = iterator_2.next();     

                 System.out.println(“tmp.get(key) is :”+tmp.get(key));     

                }              

            }     

        }
 

输出结果如下图所示

这样就可以明显看出只有TreeMap得到的记录是排过序的。

最新文章

  1. Odoo 二次开发教程(四)-只读、唯一性验证和ORM方法介绍
  2. javascript关于继承
  3. android下面使用SurfaceView+ mediaPlayer播放视频
  4. 实现基于Task的异步模式
  5. 说说GET和POST方法的区别
  6. Java OCR 图像智能字符识别技术,可识别中文
  7. Hadoop2安装
  8. ECC校验优化之路
  9. 【转】深入理解Java内存模型(一)——基础
  10. angularjs中ng-switch的用法
  11. js ||与&&
  12. POJ 3602 Typographical Ligatures
  13. POJ 1163 The Triangle【dp+杨辉三角加强版(递归)】
  14. 学好js的步骤
  15. .NET Core微服务之基于Jenkins+Docker实现持续部署(Part 1)
  16. Vue开发插件
  17. codeforces148----E. Porcelain
  18. MySQL查看当前的连接信息
  19. 熔断监控面板(Hystrix Dashboard)
  20. Iframe跨域JavaScript自动适应高度

热门文章

  1. 如何保护自己的GitHub代码不被别人覆盖
  2. php实现异步的程序调用
  3. opencv学习(1.2) - Windows 10 安装OpenCV &配置VS 2015
  4. BD面试题1-两个大文件中找出公共记录[转载]
  5. gdb core
  6. 【web Api性能提升技巧】(2)从DataReader手工创建Json字符串
  7. 粗略介绍Java AQS的实现原理
  8. Nginx配置性能优化(转)
  9. vue package.json 解析
  10. 安装vmware虚拟机和linux(centos)