标签:
Map接口实现Collection接口,是集合三大接口之一。
Map接口在声明:public interface Map<K,V>;将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值,如果一个键映射到多个值,其前面映射的值将会被后面映射的值所覆盖,其映射关系的实现类主要是HasgMap和TreeMap类,HashMap的映射实现不保存顺序,TreeMap的映射实现,可明确保证其顺序。
1.HashMap
HashMap声明:
1 public class HashMap<K,V> 2 extends AbstractMap<K,V> 3 implements Map<K,V>, Cloneable, Serializable
HashMap类是基于哈希表(数组和链表)Map接口的实现,允许使用null键和mull值,非同步,线程不安全,其大致与Hashtable相同,此类不保证映射的顺序,及顺序不能恒久不变。其默认构造方法构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap,也就是当数组容量达到总容量的75%,数组要进行扩充,则要对该哈希表进行 rehash 操作,即重建内部数据结构(哈希表的重新散列)。哈希表保存对象时,根据键(K)对象的hashcode对HashMap此时总容量求余,以确定该键值对代表的映射关系存在数组的哪一个位置,之后在该位置的其他映射关系将以链表的形式存放。
1 package com.test; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 import java.util.Set; 6 7 public class HashMapDemo { 8 public static void hashMap(){ 9 Map<Integer, String> hashmap = new HashMap<>(); 10 hashmap.put(1, "string1"); 11 hashmap.put(2, "string2"); 12 hashmap.put(3, "string3"); 13 hashmap.put(3, "string4");//注意相同键值下的映射关系的覆盖 14 hashmap.put(null, "string3"); 15 hashmap.put(null, "string4"); 16 /* 17 * null为作为键时,继续保持键的唯一性(键中只能出现一次),若键有多个映射值,则最后一个映射值覆盖前面的映射值 18 * null作为值时与键有唯一性,可多次使用 19 */ 20 System.out.println("null为键时得到的值:"+hashmap.get(null)); 21 hashmap.put(4, null);//关联键值对 22 hashmap.put(5, null); 23 System.out.println("null作为值时返回:"+hashmap.get(5)); 24 /* 25 * HashMap的遍历 26 * keySet()返回此映射所包含的所有键的Set视图 27 */ 28 System.out.println("******HashMap的遍历******"); 29 Set<Integer> h = hashmap.keySet(); 30 for (Integer i : h) { 31 System.out.println(hashmap.get(i)); 32 } 33 } 34 public static void main(String[] args) { 35 hashMap(); 36 } 37 }
运行结果:
1 null为键时得到的值:string4 2 null作为值时返回:null 3 ******HashMap的遍历****** 4 string4 5 string1 6 string2 7 string4 8 null 9 null
2.Hashtable
Hashtable声明:
1 public class Hashtable<K,V> 2 extends Dictionary<K,V> 3 implements Map<K,V>, Cloneable, Serializable
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非null 对象都可以用作键或值,同步,线程安全,键具有唯一性,同一键值的映射关系后面的赋值会覆盖前面相同键对应的值,其他与HashMap类似。
1 package com.test; 2 3 import java.util.Hashtable; 4 import java.util.Set; 5 /* 6 * Hashtable类似于HashMap 7 * 线程安全,键值对任何一方不能使用null值 8 */ 9 public class HashtableDemo { 10 public static void main(String[] args) { 11 Hashtable<String,String> hashtable = new Hashtable<>(); 12 hashtable.put("1", "manu1"); 13 hashtable.put("2", "manu2"); 14 hashtable.put("3", "manu3"); 15 // hashtable.put(null, "manu3");//报错 16 // hashtable.put("4", null); 17 hashtable.put("3", "manu5"); 18 Set<String> set = hashtable.keySet(); 19 for (String s : set) { 20 System.out.println(hashtable.get(s)); 21 } 22 } 23 } 24 运行结果: 25 manu5 26 manu2 27 manu1
3.TreeMap
TreeMap类的声明:
1 public class TreeMap<K,V> 2 extends AbstractMap<K,V> 3 implements NavigableMap<K,V>, Cloneable, Serializable
TreeMap是基于红黑树实现,是一种平衡二叉树,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法,非同步,线程不安全,相较HashMap速率稍慢。
1 package com.test; 2 3 import java.util.Iterator; 4 import java.util.Map.Entry; 5 import java.util.TreeMap; 6 7 /* 8 * 基于红黑树实现,又叫平衡二叉树 9 * 自定义对象作为键时 ,必须实现comparator接口 10 * 以自然顺序或按照compareto方法规定排序 11 * 键的唯一性 12 */ 13 public class TreeMapDemo { 14 public static void main(String[] args) { 15 TreeMap<String,Test> treemap = new TreeMap<>(); 16 Test t1 = new Test(1,"manu1",10); 17 Test t2 = new Test(2,"manu2",20); 18 Test t3 = new Test(3,"manu3",30); 19 treemap.put("a", t1); 20 treemap.put("a", t2);//Map中键值对的键都具有唯一性,会覆盖前面的 21 treemap.put("b", t3); 22 System.out.println(treemap.get("a")); 23 System.out.println(treemap.get("b")); 24 /* 25 * entrySet() 26 * 返回此映射中包含的映射关系的 Set视图,就是获取键值对对象集合 27 * 而keySet()返回此映射中包含的键的Set视图 ,就是获取该集合中的K集合 28 */ 29 System.out.println("******Iterator******"); 30 Iterator<Entry<String, Test>> i = treemap.entrySet().iterator(); 31 while(i.hasNext()){ 32 System.out.println(i.next()); 33 } 34 } 35 36 } 37 运行结果: 38 id=2, name=manu2, age=20 39 id=3, name=manu3, age=30 40 ******Iterator****** 41 a=id=2, name=manu2, age=20 42 b=id=3, name=manu3, age=30
标签:
原文地址:http://www.cnblogs.com/jzmanu/p/5484190.html