(五)、Java复习笔记之Map集合

来源:互联网 发布:mac用pe安装win7系统 编辑:程序博客网 时间:2024/05/18 20:07

集合继承体系图

这里写图片描述

64、Map集合

  • 概述
    • 将键映射到值的对象
    • 一个映射不能包含重复的键
    • 每个键最多只能映射到一个值
  • Map接口和Collection接口的不同
    • Map是双列的,Collection是单列的
    • Map的键唯一,Collection的子体系Set是唯一的
    • Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
  • 成员方法
    • V put(K key,V value):添加元素。
      • 如果键是第一次存储,就直接存储元素,返回null
      • 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
    • void clear():移除所有的键值对元素
    • V remove(Object key):根据键删除键值对元素,并把值返回
    • boolean containsKey(Object key):判断集合是否包含指定的键
    • boolean containsValue(Object value):判断集合是否包含指定的值
    • boolean isEmpty():判断集合是否为空
    • Set< Map.Entry< K,V>> entrySet():返回此映射中包含的映射关系的 Set 视图。
    • V get(Object key):根据键获取值
    • Set< K> keySet():获取集合中所有键的集合
    • Collection values():获取集合中所有值的集合
    • int size():返回集合中的键值对的个数
  • Map集合的遍历之键找值

    HashMap<String, Integer> hm = new HashMap<>();hm.put("张三", 23);hm.put("李四", 24);hm.put("王五", 25);hm.put("赵六", 26);/*Set<String> keySet = hm.keySet();         //获取集合中所有的键Iterator<String> it = keySet.iterator();    //获取迭代器while(it.hasNext()) {                       //判断单列集合中是否有元素    String key = it.next();                 //获取集合中的每一个元素,其实就是双列集合中的键    Integer value = hm.get(key);            //根据键获取值    System.out.println(key + "=" + value);  //打印键值对}*/for(String key : hm.keySet()) {             //增强for循环迭代双列集合第一种方式    System.out.println(key + "=" + hm.get(key));}
  • Map集合的遍历之键值对对象找键和值

    HashMap<String, Integer> hm = new HashMap<>();hm.put("张三", 23);hm.put("李四", 24);hm.put("王五", 25);hm.put("赵六", 26);/*Set<Entry<String, Integer>> entrySet = hm.entrySet(); //获取所有的键值对象的集合Iterator<Entry<String, Integer>> it = entrySet.iterator();//获取迭代器while(it.hasNext()) {    Entry<String, Integer> en = it.next();              //获取键值对对象    String key = en.getKey();                               //根据键值对对象获取键    Integer value = en.getValue();                          //根据键值对对象获取值    System.out.println(key + "=" + value);}*/for(Entry<String,Integer> en : hm.entrySet()) {    System.out.println(en.getKey() + "=" + en.getValue());}

65、HashMap类

  • 概述
    • key值的数据结构与HashSet类似,无序(存和取的顺序不一致),无索引,不允许重复存储。HashSet实际上由HashMap实现。
  • 实例

    public class Test {    public static void main(String[] args) {        HashMap<Student, String> hm = new HashMap<>();        hm.put(new Student("张三", 23), "北京");        hm.put(new Student("张三", 23), "上海");        hm.put(new Student("李四", 24), "广州");        hm.put(new Student("王五", 25), "深圳");        System.out.println(hm);        //{Student [name=李四, age=24]=广州, Student [name=张三, age=23]=上海, Student [name=王五, age=25]=深圳}    }}class Student {    private String name;    private int age;    //getters and setters, constructor     @Override    public int hashCode() {        int result = 17;        result = 31 * result + name.hashCode();        result = 31 * result + age;        return result;    }    @Override    public boolean equals(Object obj) {        if(this == obj) return true;        if(!(obj instanceof Student)) return false;        Student stu = (Student)obj;        return stu.getName().equals(name) && stu.getAge() == age;    }    @Override    public String toString() {        return "Student [name=" + name + ", age=" + age + "]";    }}   

66、LinkedHashMap类

  • 概述
    • 底层是链表实现的可以保证怎么存就怎么取
  • 实例

    LinkedHashMap<String, Integer> lhm = new LinkedHashMap<>();lhm.put("张三", 23);lhm.put("李四", 24);lhm.put("赵六", 26);lhm.put("王五", 25);System.out.println(lhm);//{张三=23, 李四=24, 赵六=26, 王五=25}

67、TreeMap类

  • 概述
    • 基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
    • 对照TreeSet
  • 实例
    public class Test {

        public static void main(String[] args) {//      demo1();        TreeMap<Student, String> tm = new TreeMap<>(new Comparator<Student>() {            @Override            public int compare(Student s1, Student s2) {                int num = s1.getName().compareTo(s2.getName()); //按照姓名比较                return num == 0 ? s1.getAge() - s2.getAge() : num;            }        });        tm.put(new Student("张三", 23), "北京");        tm.put(new Student("李四", 13), "上海");        tm.put(new Student("赵六", 43), "深圳");        tm.put(new Student("王五", 33), "广州");        System.out.println(tm);    }    public static void demo1() {        TreeMap<Student, String> tm = new TreeMap<>();        tm.put(new Student("张三", 23), "北京");        tm.put(new Student("李四", 13), "上海");        tm.put(new Student("王五", 33), "广州");        tm.put(new Student("赵六", 43), "深圳");        System.out.println(tm);    }}class Student implements Comparable<Student>{    private String name;    private int age;    //getters and setters, constructor     @Override    public int hashCode() {        int result = 17;        result = 31 * result + name.hashCode();        result = 31 * result + age;        return result;    }    @Override    public boolean equals(Object obj) {        if(this == obj) return true;        if(!(obj instanceof Student)) return false;        Student stu = (Student)obj;        return stu.getName().equals(name) && stu.getAge() == age;    }    @Override    public int compareTo(Student o) {        int num = this.age - o.age;        return num == 0 ? this.name.compareTo(o.name) : num;    }    @Override    public String toString() {        return "Student [name=" + name + ", age=" + age + "]";    }}
  • 统计字符串中每个字符出现的次数

    String str = "aaaabbbcccccccccc";char[] arr = str.toCharArray();                     HashMap<Character, Integer> hm = new HashMap<>();for(char c : arr) {                                     if(!hm.containsKey(c)) {                                hm.put(c, 1);                                   }else {                                             hm.put(c, hm.get(c) + 1);                   }}for (Character key : hm.keySet()) {                     System.out.println(key + "=" + hm.get(key));}

68、HashMap和Hashtable的区别

  • 执行速度:HashMap > Hashtable
  • Hashtable线性安全,效率低、HashMap线性不安全,效率高。
  • Hashtable不可以存储null键和null值,HashMap可以存储null键和null值。
  • Hashtable已被HashMap取代。

69、Collections工具类

  • 概述
    • 针对集合操作的工具类
  • 成员方法
    public static < T > void sort(List< T > list,Comparator< ? super T> c) //根据指定比较器产生的顺序对指定列表进行排序。
    public static < T > int binarySearch(List< ? > list,T key) //使用二分搜索法搜索指定列表,以获得指定对象。
    public static < T > T max(Collection< ? > coll) //根据元素的自然顺序,返回给定 collection 的最大元素。
    public static void reverse(List< ? > list) //反转指定列表中元素的顺序。
    public static void shuffle(List< ? > list) //使用默认随机源对指定列表进行置换(洗牌操作)。
  • 实例

    • (1)模拟斗地主洗牌和发牌,牌没有排序

      //买一副扑克String[] num = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};String[] color = {"方片","梅花","红桃","黑桃"};ArrayList<String> poker = new ArrayList<>();for(String s1 : color) {    for(String s2 : num) {        poker.add(s1.concat(s2));    }}poker.add("小王");poker.add("大王");//洗牌Collections.shuffle(poker);//发牌ArrayListString> gaojin = new ArrayList<>(); //人物1ArrayList<String> longwu = new ArrayList<>(); //人物2ArrayList<String> me = new ArrayList<>(); //人物3ArrayList<String> dipai = new ArrayList<>(); //三张底牌 for(int i = 0; i < poker.size(); i++) {    if(i >= poker.size() - 3) {        dipai.add(poker.get(i));    }else if(i % 3 == 0) {        gaojin.add(poker.get(i));    }else if(i % 3 == 1) {        longwu.add(poker.get(i));    }else {        me.add(poker.get(i));    }}//看牌System.out.println(gaojin);System.out.println(longwu);System.out.println(me);System.out.println(dipai);
    • (2)模拟斗地主洗牌和发牌并对牌进行排序

      public class Test {    public static void main(String[] args) {        //买一副牌        String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};        String[] color = {"方片","梅花","红桃","黑桃"};        HashMap<Integer, String> hm = new HashMap<>(); //存储索引和扑克牌,索引值小的牌面也小        ArrayList<Integer> list = new ArrayList<>(); //存储索引,操作索引就ok        int index = 0; //索引的开始值        for(String s1 : num) {            for(String s2 : color) {                hm.put(index, s2.concat(s1)); //将索引和扑克牌添加到HashMap中                list.add(index); //将索引添加到ArrayList集合中                index++;            }        }        hm.put(index, "小王");        list.add(index);        index++;        hm.put(index, "大王");        list.add(index);        //洗牌        Collections.shuffle(list);        //发牌        TreeSet<Integer> gaojin = new TreeSet<>();        TreeSet<Integer> longwu = new TreeSet<>();        TreeSet<Integer> me = new TreeSet<>();        TreeSet<Integer> dipai = new TreeSet<>();        for(int i = 0; i < list.size(); i++) {            if(i >= list.size() - 3) {                dipai.add(list.get(i)); //将list集合中的索引添加到TreeSet集合中会自动排序            }else if(i % 3 == 0) {                gaojin.add(list.get(i));            }else if(i % 3 == 1) {                longwu.add(list.get(i));            }else {                me.add(list.get(i));            }        }        //看牌        lookPoker("高进", gaojin, hm);        lookPoker("龙五", longwu, hm);        lookPoker("冯佳", me, hm);        lookPoker("底牌", dipai, hm);    }    public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer, String> hm) {        System.out.print(name + "的牌是:");        for (Integer index : ts) {            System.out.print(hm.get(index) + " ");        }        System.out.println();    }}高进的牌是:方片3 黑桃3 梅花4 黑桃4 方片6 梅花6 梅花7 红桃7 梅花8 黑桃9 梅花10 红桃10 梅花J 黑桃Q 梅花K 黑桃K 梅花A 龙五的牌是:梅花3 方片4 黑桃6 方片7 黑桃7 红桃8 黑桃8 梅花9 红桃9 黑桃10 方片J 黑桃J 方片K 黑桃A 梅花2 红桃2 小王 冯佳的牌是:红桃3 红桃4 方片5 梅花5 红桃5 方片8 方片9 红桃J 方片Q 梅花Q 红桃Q 红桃K 方片A 红桃A 方片2 黑桃2 大王 底牌的牌是:黑桃5 红桃6 方片10 
原创粉丝点击