Hello World

平行代码

关于Map集合

  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
View Code

  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 }
View Code

运行结果:

1 null为键时得到的值:string4
2 null作为值时返回:null
3 ******HashMap的遍历******
4 string4
5 string1
6 string2
7 string4
8 null
9 null
View Code

2.Hashtable

Hashtable声明:

1 public class Hashtable<K,V>
2 extends Dictionary<K,V>
3 implements Map<K,V>, Cloneable, Serializable
View Code
  此类实现一个哈希表,该哈希表将键映射到相应的值。任何非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
View Code

3.TreeMap

TreeMap类的声明:

1 public class TreeMap<K,V>
2 extends AbstractMap<K,V>
3 implements NavigableMap<K,V>, Cloneable, Serializable
View Code

  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
View Code

 
posted @ 2016-05-12 00:59  躬行之  阅读(239)  评论(0编辑  收藏  举报