java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap。
主要用于存储健值对,根据键得到值,因此不允许键重复,但允许值重复
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()); } } } /** * 判断map是否包含某个键 * @param map * @param key * @return */ 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; }
Hashmap 是一个 最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力.用synchronized修饰操作HashMap的语句块或方法。
public static void testHashMap() { Map myMap = new HashMap(); init(myMap); // HashMap的键可以为null myMap.put(null, "ddd"); // HashMap的值可以为null myMap.put("aaa", null); output(myMap); }
Hashtable 与 HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。
public static void testHashtable() { Map myMap = new Hashtable(); init(myMap); // Hashtable的键不能为null // myMap.put(null,"ddd"); // Hashtable的值不能为null // myMap.put("aaa", null); output(myMap); }
TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的,它不允许记录的键或者值为空。
public static void testTreeMap() { Map myMap = new TreeMap(); init(myMap); // TreeMap的键不能为null // myMap.put(null,"ddd"); // TreeMap的值不能为null // myMap.put("aaa", null); output(myMap); }
LinkedHashMap,键和值可以为null,可以使插入的顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。也可以是基于访问顺序,其中一个构造器:
* initialCapacity 初始容量
* loadFactor 加载因子,一般是 0.75f
* accessOrder false 基于插入顺序 true 基于访问顺序(get一个元素后,这个元素被加到最后,使用了LRU 最 近最少被使用的调度算法)
Map<String, String> m = new LinkedHashMap<String, String>(20, .80f, accessOrder ); m.put("1", "my"); m.put("2", "map"); m.put("3", "test"); m.get("1"); m.get("2"); Log.d("tag", m); 如果 accessOrder = true; 输出 {3=test, 1=my, 2=map} accessOrder = false; 输出 {1=my, 2=map,3=test}
文章评论