HashMap、HashTable、LinkedHashMap和TreeMap用法和区别

来源:互联网 发布:xshell for mac 编辑:程序博客网 时间:2024/06/08 02:17
Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap、HashTable、LinkedHashMap和TreeMap。本节实例主要介绍这4中实例的用法和区别。
关键技术剖析:
Map用于存储键值对,根据键得到值,因此不允许键重复,值可以重复。
l  (1)HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为null,不允许多条记录的值为null。HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力。
l  (2)Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。
l  (3)LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢。有HashMap的全部特性。
l  (4)TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iteraor遍历TreeMap时,得到的记录是排过序的。TreeMap的键和值都不能为空。
  
import java.util.HashMap;import java.util.Hashtable;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.Map;import java.util.TreeMap;  public class TestMap {       public static void init(Map map){      if (map != null){         String key = null;         for (int i=5; i>0; i--){            key = new Integer(i).toString() + ".0";            map.put(key, key.toString());            //Map中的键是不重复的,如果插入两个键值一样的记录,            //那么后插入的记录会覆盖先插入的记录            map.put(key, key.toString() + "0");         }      }   }     public static void output(Map map){      if (map != null){         Object key = null;         Object value = null;         //使用迭代器遍历Map的键,根据键取值         Iterator it = map.keySet().iterator();         while (it.hasNext()){            key = it.next();            value = map.get(key);            System.out.println("key: " + key + "; value: " + value );         }         //或者使用迭代器遍历Map的记录Map.Entry         Map.Entry entry = null;         it = map.entrySet().iterator();         while (it.hasNext()){            //一个Map.Entry代表一条记录            entry = (Map.Entry)it.next();            //通过entry可以获得记录的键和值            //System.out.println("key: " + entry.getKey() + "; value: " + entry.getValue());         }      }   }     public static boolean containsKey(Map map, Object key){      if (map != null){         return map.containsKey(key);      }      return false;   }     public static boolean containsValue(Map map, Object value){      if (map != null){         return map.containsValue(value);      }      return false;   }     public static void testHashMap(){      Map myMap = new HashMap();      init(myMap);      //HashMap的键可以为null      myMap.put(null,"ddd");      //HashMap的值可以为null      myMap.put("aaa", null);      output(myMap);   }     public static void testHashtable(){      Map myMap = new Hashtable();      init(myMap);      //Hashtable的键不能为null      //myMap.put(null,"ddd");      //Hashtable的值不能为null      //myMap.put("aaa", null);      output(myMap);   }     public static void testLinkedHashMap(){      Map myMap = new LinkedHashMap();      init(myMap);      //LinkedHashMap的键可以为null      myMap.put(null,"ddd");      myMap.put(null,"aaa");      //LinkedHashMap的值可以为null      myMap.put("aaa", null);      output(myMap);   }     public static void testTreeMap(){      Map myMap = new TreeMap();      init(myMap);      //TreeMap的键不能为null      //myMap.put(null,"ddd");      //TreeMap的值不能为null      //myMap.put("aaa", null);      output(myMap);   }    public static void main(String[] args) {      System.out.println("采用HashMap");      TestMap.testHashMap();      System.out.println("采用Hashtable");      TestMap.testHashtable();      System.out.println("采用LinkedHashMap");      TestMap.testLinkedHashMap();      System.out.println("采用TreeMap");      TestMap.testTreeMap();           Map myMap = new HashMap();      TestMap.init(myMap);      System.out.println("新初始化一个Map: myMap");      TestMap.output(myMap);      //清空Map      myMap.clear();      System.out.println("将myMap clear后,myMap空了么?  " + myMap.isEmpty());      TestMap.output(myMap);      myMap.put("aaa", "aaaa");      myMap.put("bbb", "bbbb");      //判断Map是否包含某键或者某值      System.out.println("myMap包含键aaa?  "+ TestMap.containsKey(myMap, "aaa"));      System.out.println("myMap包含值aaaa?  "+ TestMap.containsValue(myMap, "aaaa"));      //根据键删除Map中的记录      myMap.remove("aaa");      System.out.println("删除键aaa后,myMap包含键aaa?  "+ TestMap.containsKey(myMap, "aaa"));      //获取Map的记录数      System.out.println("myMap包含的记录数:  " + myMap.size());   }} 输出结果:采用HashMapkey: null; value: dddkey: 3.0; value: 3.00key: aaa; value: nullkey: 4.0; value: 4.00key: 1.0; value: 1.00key: 5.0; value: 5.00key: 2.0; value: 2.00采用Hashtablekey: 4.0; value: 4.00key: 1.0; value: 1.00key: 3.0; value: 3.00key: 5.0; value: 5.00key: 2.0; value: 2.00采用LinkedHashMapkey: 5.0; value: 5.00key: 4.0; value: 4.00key: 3.0; value: 3.00key: 2.0; value: 2.00key: 1.0; value: 1.00key: null; value: aaakey: aaa; value: null采用TreeMapkey: 1.0; value: 1.00key: 2.0; value: 2.00key: 3.0; value: 3.00key: 4.0; value: 4.00key: 5.0; value: 5.00新初始化一个Map: myMapkey: 3.0; value: 3.00key: 4.0; value: 4.00key: 1.0; value: 1.00key: 5.0; value: 5.00key: 2.0; value: 2.00将myMap clear后,myMap空了么?  truemyMap包含键aaa?  truemyMap包含值aaaa?  true删除键aaa后,myMap包含键aaa?  falsemyMap包含的记录数:  1 源码分析:遍历Map有两种方法:(1)map的keySet()方法获得键的集合,再调用键集合的iterator方法获得键的迭代器,以此迭代地取出Map中的键,用get方法获得键对应的值,便完成了Map的遍历。代码如下所示://使用迭代器遍历Map的键,根据键取值        Iterator it = map.keySet().iterator();        while (it.hasNext()){           key = it.next();           value = map.get(key);           System.out.println("key: " + key + "; value: " + value );        }(2)使用Map的entrySet方法获得Map中记录的集合,每条对象都是一个Map.Entry对象,使用其getKey方法获得记录的键,使用其getValue方法获得记录的值。代码如下所示:        //或者使用迭代器遍历Map的记录Map.Entry        Map.Entry entry = null;        it = map.entrySet().iterator();        while (it.hasNext()){           //一个Map.Entry代表一条记录           entry = (Map.Entry)it.next();           //通过entry可以获得记录的键和值           //System.out.println("key: " + entry.getKey() + "; value: " + entry.getValue()); 
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 农村没有住电表被卸载了怎么办 工商已吊销未注销要恢复营业怎么办 中专类学校取消后在编的老师怎么办 情迁微信内置抢红包版本过低怎么办 船运货给客户货到他不要怎么办 摩拜单车锁了还在计费怎么办 旧公司股份现成立新公司股份怎么办 比亚迪l3线路进水打不着火怎么办 新成立的建筑公司没有业绩怎么办 被骗做了深圳国税实名办税怎么办 天猫精灵生活灯老是离线怎么办 电信合约没到期不想用了怎么办 电信合约卡到期不想用了怎么办 欧普照明平板灯坏了怎么办 交通违章处理了但系统没更新怎么办 车里的空调一直吹的是热气怎么办 丰田雷凌保养手册丢了怎么办 海尔电视两年主板坏了怎么办 海信电视保修期内主板坏了怎么办 乐视电视的主板坏了怎么办 车电瓶没电了打不着火怎么办 面包车没电了打不着火怎么办 汽车电瓶没电了打不着火怎么办 自动挡的车没有电打不起来火怎么办 自动挡汽车没电了打不着火怎么办 自动挡小车没电了打不着火怎么办 被4s店销售骗了怎么办 宇通客车尿素泵不工作怎么办 汽车打蜡不小心打在车帮怎么办 海信电视怎么安装第三方软件怎么办 网上买票的时候不想用学生票怎么办 南方公园完整破碎讲话嘴不动怎么办 同一个安全员被锁在两个项目怎么办 家长拖欠家教老师的课时费怎么办 合同没到期房东不退押金怎么办 租房合同没到期房东要违约怎么办 档案存放费交了一年的延期怎么办 天津房子卖了户口没地方迁怎么办 中国到美国读计算机硕士签证怎么办 在江苏大学去德国读研怎么办? 宿舍上下铺的床一动就响怎么办