zoukankan      html  css  js  c++  java
  • 关于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

     
  • 相关阅读:
    Python shutil模块
    Flask 上传文件
    Flask DBUtils
    flash-session
    Flash 上下文管理
    python 栈
    python 偏函数
    threding.local
    next() 与 nextLine() 区别
    Thread.sleep(1000*3); // 休眠3秒
  • 原文地址:https://www.cnblogs.com/jzmanu/p/5484190.html
Copyright © 2011-2022 走看看