Java中的Map及其使用

技术标签: JAVA  

Map

Map集合概述和特点

概述:
将键映射到值的对象
一个映射不能包含重复的键
每个键最多只能映射到一个值
Map接口和Collection接口的不同
Map是双列的,Collection是单列的
Map的键唯一,Collection的子体系Set是唯一的
Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效

Map集合的功能概述

a:添加功能
V put(K key,V value):添加元素。这个其实还有另一个功能?替换
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
b:删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
c:判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
d:获取功能
Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
V get(Object key):根据键获取值
Set keySet():获取集合中所有键的集合
Collection values():获取集合中所有值的集合
e:长度功能
int size():返回集合中的键值对的对数

Map集合的遍历之键找值

获取所有键的集合
遍历键的集合,获取到每一个键
根据键找值

public class Test4 {
    public static void main(String[] args) {
        HashMap<Phone,String> map = new HashMap<>();
        map.put(new Phone("Apple",7000),"美国");
        map.put(new Phone("Sony",5000),"日本");
        map.put(new Phone("Huawei",6000),"中国");
        Set<Phone> phones = map.keySet();
        Iterator<Phone> iterator = phones.iterator();
        while (iterator.hasNext()){
            Phone next = iterator.next();
            System.out.println(next.getBrand()+"=="+next.getPrice()+"=="+map.get(next));
        }

    }
}
class Phone{
    private String Brand;
    private int Price;

    public Phone(String brand, int price) {
        Brand = brand;
        Price = price;
    }

    public String getBrand() {
        return Brand;
    }

    public void setBrand(String brand) {
        Brand = brand;
    }

    public int getPrice() {
        return Price;
    }

    public void setPrice(int price) {
        Price = price;
    }
}

获取所有键值对对象的集合
遍历键值对对象的集合,获取到每一个键值对对象
根据键值对对象找键和值

public class Test4 {
    public static void main(String[] args) {
        HashMap<Phone,String> map = new HashMap<>();
        map.put(new Phone("Apple",7000),"美国");
        map.put(new Phone("Sony",5000),"日本");
        map.put(new Phone("Huawei",6000),"中国");
        Set<Map.Entry<Phone, String>> entries = map.entrySet();
        for (Map.Entry<Phone, String> entry : entries) {
            System.out.println(entry.getKey().getBrand()+"==="+entry.getKey().getPrice()+"==="+entry.getValue());
        }
    }
}

一般来说建议使用entrySet遍历方式,其效率高

LinkedHashMap的概述和使用

LinkedHashMap的概述: Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序LinkedHashMap的特点: 底层的数据结构是链表和哈希表 元素有序 并且唯一
元素的有序性由链表数据结构保证 唯一性由 哈希表数据结构保证
Map集合的数据结构只和键有关

TreeMap集合

TreeMap 键不允许插入null
TreeMap: 键的数据结构是红黑树,可保证键的排序和唯一性
排序分为自然排序和比较器排序
线程是不安全的效率比较高
TreeMap集合排序:
实现Comparable接口,重写CompareTo方法
使用比较器

TreeMap集合的遍历

public class Test4 {
    public static void main(String[] args) {
        TreeMap<Phone,String> map = new TreeMap<>();
        map.put(new Phone("Apple",7000),"美国");
        map.put(new Phone("Sony",5000),"日本");
        map.put(new Phone("Huawei",6000),"中国");
        Set<Phone> phones = map.keySet();
        Iterator<Phone> iterator = phones.iterator();
        while(iterator.hasNext()){
            Phone next = iterator.next();
            System.out.println(next.getBrand()+"==="+next.getPrice()+"==="+map.get(next));
        }
    }
}
class Phone implements Comparable<Phone>{
    private String Brand;
    private int Price;

    public Phone(String brand, int price) {
        Brand = brand;
        Price = price;
    }

    public String getBrand() {
        return Brand;
    }

    public void setBrand(String brand) {
        Brand = brand;
    }

    public int getPrice() {
        return Price;
    }

    public void setPrice(int price) {
        Price = price;
    }

    @Override
    public int compareTo(Phone o) {
        return this.getPrice() - o.getPrice();
    }
}

集合嵌套之HashMap嵌套HashMap

基础班
张三 20
李四 22
就业班
王五 21
赵六 23

public class Test5 {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("张三",20);
        map.put("李四",22);
        HashMap<String, Integer> map1 = new HashMap<>();
        map1.put("王五",21);
        map1.put("赵六",23);
        HashMap<String, HashMap<String, Integer>> mapmax = new HashMap<>();
        mapmax.put("基础班",map);
        mapmax.put("就业班",map1);
        Set<Map.Entry<String, HashMap<String, Integer>>> entries = mapmax.entrySet();
        for (Map.Entry<String, HashMap<String, Integer>> entry : entries) {
            System.out.println(entry.getKey());
            Set<Map.Entry<String, Integer>> entries1 = entry.getValue().entrySet();
            for (Map.Entry<String, Integer> stringIntegerEntry : entries1) {
                System.out.println("\t"+stringIntegerEntry.getKey()+"     "+stringIntegerEntry.getValue());
            }
        }
    }
}

Arraylist嵌套HashMap

public class Test3 {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("周瑜","小乔");
        map.put("吕布","貂蝉");
        HashMap<String, String> map1 = new HashMap<>();
        map1.put("郭靖","黄蓉");
        map1.put("杨过","小龙女");
        HashMap<String, String> map2 = new HashMap<>();
        map2.put("令狐冲","任盈盈");
        map2.put("林平之","岳灵珊");
        ArrayList<HashMap<String, String>> list = new ArrayList<>();
        list.add(map);
        list.add(map1);
        list.add(map2);
        for (HashMap<String, String> s : list) {
            Set<String> strings = s.keySet();
            for (String s1 : strings) {
                String s2 = s.get(s1);
                System.out.println("\t"+s1+"---"+s2);

            }
            System.out.println();
        }
    }
}

Collections工具类的概述和常见方法

A:Collections类概述: 针对集合操作 的工具类
B:Collections成员方法
public static void sort(List list): 排序,默认按照自然顺序
public static int binarySearch(List<?> list,T key): 二分查找
public static T max(Collection<?> coll): 获取最大值
public static void reverse(List<?> list): 反转
public static void shuffle(List<?> list): 随机置换

模拟斗地主洗牌和发牌并对牌进行排序的代码实现
在这里插入图片描述

public class Test4 {
    public static void main(String[] args) {
        //A:
        //案例演示:
        //模拟斗地主洗牌和发牌,牌没有排序
        //得有一副牌
        //生成54张牌放到牌盒里面
        String[] colors = {"", "", "", ""};
        String[] nums = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        HashMap<Integer, String> map = new HashMap<Integer, String>();
        ArrayList<Integer> list = new ArrayList<>();
        int index = 0;
        for (String num : nums) {
            for (String color : colors) {
                map.put(index, color.concat(num));
                list.add(index);
                index++;
            }
        }

            map.put(index, "☆");
            list.add(index);
            index++;
            map.put(index, "★");
            list.add(index);


            //洗牌
            Collections.shuffle(list);

            //发牌
            TreeSet<Integer> 高进 = new TreeSet<>();
            TreeSet<Integer> 刀仔 = new TreeSet<>();
            TreeSet<Integer> 星仔 = new TreeSet<>();
            TreeSet<Integer> 底牌 = new TreeSet<>();
            // 高进 = (ArrayList<String>) pokerBox.subList(0,17);
            // 高进 0  3 6 9
            //刀仔 1 4 7 10
            //  星仔 2 5 8 11
            for (int i = 0; i < list.size(); i++) {
                if (i >= list.size() - 3) {
                    底牌.add(list.get(i));
                } else if (i % 3 == 0) {
                    高进.add(list.get(i));
                } else if (i % 3 == 1) {
                    刀仔.add(list.get(i));
                } else {
                    星仔.add(list.get(i));
                }
            }



            //看牌
            lookPoker(map,高进,"高进");
            lookPoker(map,刀仔,"刀仔");
            lookPoker(map,星仔,"星仔");
            lookPoker(map,底牌,"底牌");



    }

    public static void lookPoker(HashMap<Integer, String> map, TreeSet<Integer> list, String name) {
        System.out.println(name);
        for (Integer s : list) {
            System.out.print(map.get(s));
        }
        System.out.println();
    }
}

Map中的键唯一,但是当存储自定义对象时,需要重写Hashcode和equals方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/taraex/article/details/90243965

智能推荐

遍历二维数组,打印杨辉三角_巷子println的博客-程序员宝宝

使用方法改进遍历二维数组,杨辉三角;本周老师带领我们讲解了数组和二维数组,方法还有面向对象,先写一下二维数组的遍历;```public class PrintArrays{ public static void main(String[] args){ int [] [] arr = {{11,22,33},{44,55,66},{77,88,99}}; Print(arr); } public static void Print(int [][]arr){ .

这种PDF在线转化成Word的方法你知道吗?_chuanlv2691的博客-程序员宝宝

在互联网的快速发展中,在办公软件的迅速增加中,PDF和Word已经是很常见的一种格式,很多人不知道PDF和Word还可以进行转换,那么PDF怎么才可以在线免费成Word呢?下面就带大家来操作一下PDF在线转换成Word格式 操作使用工具:迅捷PDF在线转换器 迅捷PDF在线转换器:http...

集群部署时ehcache的diskStore的设置_暮云收尽溢清寒的博客-程序员宝宝

集群部署时ehcache的diskStore的设置我们设置ehcache的硬盘存储文件的缓存路径时,需要设置以下内容:<diskStore path="java.io.tmpdir" />以上设置是指将存储到硬盘的存储文件存储到”java.io.tmpdir”的路径下,”java.io.tmpdir” 根据不同的系统和中间件会指向不同的路径。很多时候我们部署集群环境时,会存在一个物理机器上部署多个集

vmware workstation exsi下载与安装_中国lanwp的博客-程序员宝宝

一、 vmware官方下载官方下载地址:https://my.vmware.com/web/vmware/downloads选择需要下载的软件下载二、一些说明VMware vSphere Hypervisor (ESXi) vSphere Hypervisor就是ESXi三、安装1. exsi安装vmware esxi6.7(附安装系统教程) 免费版 http://www....

数据分析Power BI数据可视化教程(三)——如何创建矩阵和表以及散点图_Lee-Shyllen的博客-程序员宝宝

Power BI 是基于云的商业数据分析和共享工具,它能帮您把复杂的数据转化成最简洁的视图。通过它,您可以快速创建丰富的可视化交互式报告,即使在外也能用手机端 APP 随时查看。甚至检测公司各项业务的运行状况,只需它仪表板的一个界面就够了。该篇教程主要为大家讲解Power BI 引导学习课程的可视化。今天继续讲解Power BI 中如何创建矩阵和表以及散点图的相关教程。&amp;gt;&amp;gt;下载最...

随便推点

Flann在python3中的实现_coyote_xujie的博客-程序员宝宝_flann python

这个pyhton2和python3不兼容实在是太要命了!!!血坑!!!安装pip install pyflann适配网上有很多方法是这样的:sudo 2to3 -w [pyflann directory in dist-packages]但是我在实际操作中还是不行,但是也有人是成功的直接在文件中修改1.修改导入规则所有的from xxx import *改为from .xxx import *涉及文件有:bindings/init.pythe pyflann im

python内置函数排序_python 使用内置函数sorted对各种数据类型进行排序_weixin_39819974的博客-程序员宝宝

python有两个内置的函数用于实现排序,一个是list.sort()函数,一个是sorted()函数。区别1:list.sort()函数只能处理list类型数据的排序;sorted()则可以处理多种类型数据的排序。区别2:list.sort()会修改原来的list为排序后的结果;sorted()不会修改原来的数据,只是返回一个排序后的对象。下面来动手写点代码进行测试:list进行简单的排序1 &...

微信公众平台开发——微信授权登录(OAuth2.0)_daxingsuo3996的博客-程序员宝宝

1、OAuth2.0简介  OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。  允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例...

python中的ideavim有什么作用_【进击的Vimmer】为什么选择vim_weixin_39613433的博客-程序员宝宝

当你看到一些大牛飞快敲击键盘而不用鼠标的时候你可能很羡慕和佩服,其实这完全没有必要。就像一个吉他手熟练地弹吉他有必要羡慕吗?一个瓦匠熟练地砌砖有必要羡慕吗?这些都是他们赖以生存的工具而已,熟练地运用工具是理所当然的事情。而一个程序员,一个文本编辑者,你如果没有熟练运用你的编辑工具,其实还是挺不应该的,而工具又有优劣之分,选对工具很重要。众所周知,编辑器有很多,Sublime、Notepad++、E...

fzu 防守阵地 1_古宇hhhh的博客-程序员宝宝

#include#include#define rr 1000000int a[rr+5],sum[rr+5],ssum[rr+5];int main(){ int n,m; while(~scanf("%d%d",&n,&m)) { sum[0]=ssum[0]=0; for(int i=1;i<=n;i++)

DES & 3DES_哎一入江湖岁月催的博客-程序员宝宝

DES是美国1977-1998年数据加密标准DES(Data Encryption Standard)数据加密标准算法,采用56bits密钥加密64bits数据成密文的一种分组密码,其基本结构为Feistel,共计16Round(轮)。分组密码设计的两个原则:混淆(Confusion)和扩散(Diffusion)具体过程:一轮:将要加密信息进行分组,每64位一组明文信息 每一...

推荐文章

热门文章

相关标签