zoukankan      html  css  js  c++  java
  • 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)) + ",");
    
                }
            }
        }
    
    }
  • 相关阅读:
    IOS触摸事件
    IOS中内存管理机制浅解
    Info.plist与Prefix.pch修改文件位置遇到的问题及解决方法
    block使用小结、在arc中使用block、如何防止循环引用
    __block的作用
    ios中键值编码kvc和键值监听kvo的特性及详解
    ios多线程开发的常用三种方式
    Xcode7连接网络设置
    不能弹出虚拟键盘的解决办法
    【测试工具】moco入门(一)
  • 原文地址:https://www.cnblogs.com/wadmwz/p/9311069.html
Copyright © 2011-2022 走看看