Java之Map

Map的初次学习

首次学习map的学习笔记,有错误还请谅解

map的层次结构

Map的层次结构

概述

java.util.Map<Key,Value>的特点:

  • Map集合是一个双列集合,存放的是键值对
  • Map的键不可以重复,但是值可以重复.
  • Map中的key和value的类型不一定相同
  • key和value一一对应

子类

HashMap集合的特点:

  • 底层是哈希表 : 查询速度很快.

JDK1.8之前是数组 + 单向链表,JDK1.8之后是数组 + 单向链表/红黑树

  • hashMap的集合是一个无序的集合,存取顺序可能不一致

LinkedHashMap的特点:

  • 底层是哈希表 + 链表(保证元素有序,迭代顺序一致)
  • 存取的顺序是一直的.

常用的方法:

  • public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。

存储时,key不存在的时候,返回值为null,key存在时,使用新的value替换旧的value.,返回旧的value
所以该方法可以看做增加,也可以看做修改

  • public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的
    值。

key存在,返回被删除的value,key不存在,返回null

  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。

key存在,返回对应的value值,key不存在,返回null

  • boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。

包含指定的key,返回true,不包含返回false

  • boolean containsValue(Object value) 如果此map包含指定的值,则返回 true 。
  • public Set keySet() : 获取Map集合中所有的键,存储到Set集合中。

map集合不能直接使用迭代器进行遍历,所以可以使用keySet方法和get方法可以来进行遍历.

  • Collection values() 返回此结合中包含的值的Collection视图。
  • public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。

在Map接口中有一个内部接口Entry,entry的作用是 :
当Map集合一创建,那么就会在Map集合中创建一个Entry对象,用来记录键与值(键值对对象/键与值的映射关系).

Entry中常用方法 :

  • K getKey() 返回与此条目相对应的键。
  • V getValue() 返回与此条目相对应的值。
  • V setValue(V value) 用指定的值替换与该条目相对应的值(可选操作)。

Map如何保证key值唯一呢?

可以参考前面的HashSet,底层相同,所以原理也差不多,都是依赖于hashCode方法和equals方法.

LinkedHashMap

底层原理是 : 哈希表 + 链表(记录顺序),参考LinkedHashSet.
特点:

  • 不能存取重复的key
  • 存取有序

案例(斗地主将牌进行排序输出):

import java.util.*;

/**
 * 斗地主案例
 *  1. 组装54张扑克牌将
 * 2. 54张牌顺序打乱
 * 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
 * 4. 查看三人各自手中的牌(按照牌的大小排序)、底牌
 *
 * 1. 准备牌:
 *      完成数字与纸牌的映射关系:
 *      使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。
 * 2. 洗牌:
 *      通过数字完成洗牌发牌
 * 3. 发牌:
 *      将每个人以及底牌设计为ArrayList,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
 *      存放的过程中要求数字大小与斗地主规则的大小对应。
 *      将代表不同纸牌的数字分配给不同的玩家与底牌。
 * 4. 看牌:
 *      通过Map集合找到对应字符展示。
 * @author WZLOVE
 * @create 2018-07-14 14:34
 */
public class LinkedHashMapDemo {

    public static void main(String[] args) {
        // 准备牌
        String[] arr1 = {"♠","♥","♣","♦"};
        String[] arr2 = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        HashMap<Integer,String> hashMap = new HashMap<>();
        int k = 0;
        hashMap.put(k++,"大王");
        hashMap.put(k++,"小王");
        for (int i = 0; i < arr2.length; i++) {
            for (int i1 = 0; i1 < arr1.length; i1++) {
                hashMap.put(k++,arr1[i1] + arr2[i]);
            }
        }

        /*for (Map.Entry<Integer, String> entry : hashMap.entrySet()) {
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }*/

        // 洗牌,将键洗牌,值跟随键排列

        Set<Integer> set = hashMap.keySet();
        ArrayList<Integer> intList = new ArrayList<>();
        for (Integer integer : set) {
            intList.add(integer);
        }
        Collections.shuffle(intList);

        // 发牌
        ArrayList<Integer> list1 = new ArrayList<>();
        ArrayList<Integer> list2 = new ArrayList<>();
        ArrayList<Integer> list3 = new ArrayList<>();
        ArrayList<Integer> list4 = new ArrayList<>();

        for (int i = 0; i < intList.size(); i++) {
            if(i >= 51){
                list4.add(intList.get(i));
            } else if(i % 3 == 0){
                list1.add(intList.get(i));

            }else if(i % 3 == 1){

                list2.add(intList.get(i));
            }else if(i % 3 == 2){

                list3.add(intList.get(i));
            }
        }

        list1 = sortList(list1);
        list2 = sortList(list2);
        list3 = sortList(list3);
        list4 = sortList(list4);

        print(list1,hashMap);
        print(list2,hashMap);
        print(list3,hashMap);
        print(list4,hashMap);

    }

    /**
     * 进行排序
     * @param list  需要排序的集合
     * @return      排好序的集合
     */
    public static ArrayList<Integer> sortList(ArrayList<Integer> list){
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1- o2;
            }
        });

        return list;
    }

    /**
     * 格式化输出
     * @param list      键的集合
     * @param hashMap   map集合
     */
    public static void print(ArrayList<Integer> list,HashMap<Integer,String> hashMap){
        for (int i = 0; i < list.size(); i++) {
            if( i == 0 ){
                System.out.print("[" + hashMap.get(list.get(i)) + ",");
            } else if(i == list.size() - 1){
                System.out.println(hashMap.get(list.get(i)) + "]");
            } else{
                System.out.print(hashMap.get(list.get(i)) + ",");

            }
        }
    }

}
posted @ 2018-07-14 21:47  庄子游世  阅读(134)  评论(0编辑  收藏  举报