Map集合概述和特点

  • map由两部分组成,k是map集合里面存储键的类型,v是map里面存储值的类型。
  • map集合是一个接口,将键映射到值的对象,他不能包含重复的键,每个键可以映射到一个值。
  • 举例,比如下面的学号对应姓名。学号是不能重复的,并且一定对应一个姓名
itheima001   林青霞
itheima002  张曼玉
itheima003  王祖贤
  • map是一个接口不能创建对象,HashMap实现了map接口。
  • 创建map集合采用多态的方式,使用具体的实现类HashMap。
import java.util.HashMap;
import java.util.Map;public class MapDemo01 {public static void main(String[] args) {//创建map集合对象Map<String,String> map = new HashMap<String,String>();}
}
  • put方法,map集合添加的方法用的是put。
  • 添加三个元素,看有没有成功
        map.put("itheima001","林青霞");map.put("itheima002","张曼玉");map.put("itheima003","王祖贤");System.out.println(map);

  • 存储了三个元素,他的键和值通过等于号连接起来。是HashMap重写了toString方法,他的键和值用=号拼接了起来,最终输出数据。
  • 他的键是唯一的,不能包含重复的。如果添加一个重复键,再等于不同的值。可以看见他的值被修改了。原来的值被替代掉。
  • 当键第一次出现的时候是添加元素,当键第二次出现的时候是修改元素,用后面的值把前面的值替代掉。
  • 保证键的唯一性是HaspMap实现的,底层数据结构是哈希表,哈希表主要是用来保证Map集合的键的唯一性。

Map集合的基本功能

方法名 说明
V put(K key, V value) 添加元素
V remove(Object key) 根据键删除键值对元素
void clear() 移除所有的键值对元素
boolean containsKey(Object key) 判断集合是否包含指定的键
boolean containsValue(Object value) 判断集合是否包含指定的值
boolean isEmpty() 判断集合是否为空
int size() 集合的长度,也就是集合中键值对的个数
  • 试下使用方法
import java.util.Map;
import java.util.HashMap;public class MapDemo02 {public static void main(String[] args) {//创建集合对象Map<String,String> map = new HashMap<String,String>();//添加元素map.put("张无忌","赵敏");map.put("郭靖","黄蓉");map.put("杨过","小龙女");//输出集合对象System.out.println(map);}
}

- 测试remove方法,删除郭靖这个键,黄蓉这个元素就不存在集合了。

        //remove方法System.out.println(map.remove("郭靖"));//输出集合对象System.out.println(map);

  • 删除不存在的值,返回null
  • 测试clear方法
        //clear方法map.clear();//输出集合对象System.out.println(map);

  • containsKey方法
        System.out.println(map.containsKey("郭靖"));

  • containsValue判断里面是否包含值
  • 判断集合是否为空
        System.out.println(map.isEmpty());

  • 测试长度的方法 size
        System.out.println(map.size());

Map集合的获取功能

方法名 说明
V get(Object key) 根据键获取值
Set< K> keySet() 获取所有键的集合
Collection< V> values() 获取所有值的集合
Set<Map.Entry<K,V>>entrySet() 获取所有键值对对象的集合
  • Collection这里是因为返回的值不能保证是唯一的,所以用Collection。
import java.util.HashMap;
import java.util.Map;public class MapDemo03 {public static void main(String[] args) {//创建集合对象Map<String,String >map = new HashMap<String,String>();//添加元素map.put("张无忌","赵敏");map.put("郭靖","黄蓉");map.put("杨过","小龙女");//get方法,根据键获取值System.out.println(map.get("张无忌"));}
}

  • 如果键对应的值不存在,则返回null
  • keySet方法
        Set<String> keySet = map.keySet();for(String key : keySet){System.out.println(key);}
  • keySet就是获取集合中的键
  • Collection < V > values() 获取所有值的集合
        Collection<String> values = map.values();for(String value : values){System.out.println(value);}
  • 输出map中所有的值

Map集合的遍历(方式1)

  • 我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合,假如现在有很多夫妻在一起,我要找到丈夫对应的妻子怎么办呢?
  • 首先把所有的丈夫集中起来,然后遍历所有丈夫的集合获取到每一个丈夫,最后让丈夫赵对应的妻子。这样就可以找到每一个丈夫对应的妻子。
  • 转换为Map集合的操作:
  1. 获取所有键的集合,用keySet()方法实现
  2. 遍历键的集合,获取到每一个键,用增强for可以实现。
  3. 根据键找值,用get(Object Key) 方法实现
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapDemo04 {public static void main(String[] args) {//创建集合对象Map<String, String> map = new HashMap<String, String>();//添加元素map.put("张无忌", "赵敏");map.put("郭靖", "黄蓉");map.put("杨过", "小龙女");//获取所有键的集合,用keySet()方法实现Set<String> keySet = map.keySet();//遍历键的集合,获取到每一个键,用增强for实现for (String key : keySet) {//根据键去找值,用get(Object key)方法实现String value = map.get(key);System.out.println(key + "," + value);}}
}

Map集合的遍历(方式2)

  • 获取所有结婚证的集合

  • 遍历结婚证的集合,得到每一个结婚证

  • 根据结婚证后去丈夫和妻子

  • 思路

  1. 获取所偶有键值对对象的集合,使用entrySet方法,Map.Entry可以看做是一个键值对对象,他包含了K和V。
  2. 用增强for实现,得到每一个Map.Entry,用方法去获取键值
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo05 {public static void main(String[] args) {//创建集合对象Map<String, String> map = new HashMap<String, String>();//添加元素map.put("张无忌", "赵敏");map.put("郭靖", "黄蓉");map.put("杨过", "小龙女");//获取所有键值对对象的集合Set<Map.Entry<String, String>> entrySet = map.entrySet();//遍历键值对对象的集合,得到每一个键值对对象for(Map.Entry<String, String> me : entrySet){//根据键值对对象获取键和值String key = me.getKey();String value = me.getValue();System.out.println(key + "," + value);}}
}

HashMap集合存储学生对象并遍历

  • 需求:创建一个HashMap集合,键是学号(String),值是学生对象(Student),存储三个键值对元素,并遍历。
  • 思路:
  1. 定义学生类
  2. 创建HashMap集合对象
  3. 创建学生对象
  4. 把学生添加到集合
  5. 遍历集合 :①根据键找值 ②键值对对象找键和值
  • 定义Student类
package generic.itheima06;public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Student(String name, int age) {this.name = name;this.age = age;}public Student() {}
}
  • 方式1
import java.util.HashMap;
import java.util.Set;public class HashMapDemo {public static void main(String[] args) {//创建HashMap集合对象HashMap<String, Student> hm = new HashMap<String, Student>();//创建学生对象Student s1 = new Student("林青霞", 30);Student s2 = new Student("张曼玉", 35);Student s3 = new Student("王祖贤", 33);//把学生添加到集合hm.put("itheima001", s1);hm.put("itheima002", s2);hm.put("itheima003", s3);//方式1:键找值Set<String> keySet = hm.keySet();for (String key : keySet) {Student value = hm.get(key);System.out.println(key + "," + value.getName() + "," + value.getAge());}}
}

  • 方式2
        //方式2:键值对对象找键和值Set<Map.Entry<String,Student>> entrySet = hm.entrySet();for (Map.Entry<String,Student> me : entrySet){String key = me.getKey();Student value = me.getValue();System.out.println(key + "," + value.getName() + "," + value.getAge());}

案例

  • 需求:创建一个HashMap集合,键是学生对象(Student),值是居住地(String)。存储多个键值对元素,并遍历。要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象。
  • 自定义的类型保证唯一性,这里是HashMap类型,HashMap集合底层数据结构是哈希表,主要是用来保证键的唯一性,所以学生对象里面要重写两个方法。
  • 思路:
  1. 定义学生类
  2. 创建HashMap集合对象
  3. 创建学生对象
  4. 把学生添加到集合
  5. 遍历集合
  6. 在学生类中重写两个方法保证键的唯一性:hashCode(),equals()。自动生成即可
package generic.itheima07;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
  • 创建HashMap集合对象
import java.util.HashMap;
import java.util.Set;public class HashMapDemo {public static void main(String[] args) {//创建HashMap集合对象HashMap<Student,String> hm = new HashMap<Student,String>();//创建学生对象Student s1 = new Student("林青霞",30);Student s2 = new Student("张曼玉",35);Student s3 = new Student("王祖贤",33);//把学生添加到集合hm.put(s1,"西安");hm.put(s2,"武汉");hm.put(s3,"郑州");//遍历集合Set<Student> keySet = hm.keySet();for(Student key : keySet){String value = hm.get(key);System.out.println(key.getName()+","+key.getAge()+","+value);}}
}

  • 创建一个和s3重复的s4,结果发现两个结果都出来了
  • 所以我们要在学生类里面重写两个方法
    @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age &&Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
  • 再执行一遍,王祖贤就住到北京去了。

ArrayList集合存储HashMap元素并遍历

  • HashMap本身是一个集合,所以这里是集合嵌套。
  • 需求:创建一个ArrayList集合,存储三个元素,每一个元素都是HashMap,每一个HashMap的键和值都是String,并遍历。
  • 思路:
  1. 创建ArrayList集合
  2. 创建HashMap集合,并添加键值对元素
  3. 把HashMap作为元素添加到ArrayList集合
  4. 遍历ArrayList集合
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;public class ArrayListIncludeHashMapDemo {public static void main(String[] args) {//创建ArrayList集合ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String, String>>();//创建HashMap集合并添加键值对元素HashMap<String, String> hm1 = new HashMap<String, String>();hm1.put("孙策", "大乔");hm1.put("周瑜", "小乔");//把HashMap作为元素添加到ArrayList集合array.add(hm1);HashMap<String, String> hm2 = new HashMap<String, String>();hm2.put("郭靖", "黄蓉");hm2.put("杨过", "小龙女");//把HashMap作为元素添加到ArrayList集合array.add(hm2);HashMap<String, String> hm3 = new HashMap<String, String>();hm3.put("令狐冲", "任盈盈");hm3.put("林平之", "岳灵珊");//把HashMap作为元素添加到ArrayList集合array.add(hm3);//遍历ArrayList集合for (HashMap<String, String> hm : array) {Set<String> keySet = hm.keySet();for (String key : keySet) {String value = hm.get(key);System.out.println(key + "," + value);}}}
}

HashMap集合存储ArrayList元素并遍历

  • 需求:创建一个HashMap集合,存储三个键值对元素,每一一个键值对的键是String,值是ArrayList。每一个ArrayList的元素是String,并遍历。
  • 思路:
  1. 创建HashMap集合
  2. 创建ArrayList集合,并添加元素
  3. 把ArrayList作为元素添加到HashMap集合
  4. 遍历HashMap集合
package generic.itheima08;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;public class HashMapIncluseArrayListDemo {public static void main(String[] args) {//创建HashMap集合HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>();//创建ArrayList集合并添加元素ArrayList<String> sgyy = new ArrayList<String>();sgyy.add("诸葛亮");sgyy.add("赵云");//把ArrayList作为元素添加到HashMap集合hm.put("三国演义",sgyy);//创建ArrayList集合并添加元素ArrayList<String> xyj = new ArrayList<String>();xyj.add("唐僧");xyj.add("孙悟空");//把ArrayList作为元素添加到HashMap集合hm.put("西游记",xyj);//创建ArrayList集合并添加元素ArrayList<String> shz = new ArrayList<String>();shz.add("武松");shz.add("鲁智深");//把ArrayList作为元素添加到HashMap集合hm.put("水浒传",shz);//遍历HashMap集合Set<String> keySet = hm.keySet();for ( String key : keySet){ArrayList<String> value = hm.get(key);for(String s : value){System.out.println(s);}}}
}

  • 但是这个输出我们看不出哪个是三国演义,哪个是西游记,哪个是水浒传的。所以修改一下输出语句

Java入门(三十五)相关推荐

  1. [转]周易入门三十五问答

    周易入门三十五问答 http://mt.sohu.com/20150714/n416782382.shtml 1.问:何谓<周易>? 答:<周易>是我国古代哲学.自然科学与社会 ...

  2. java入门~第十五天 基本数据类型包装类,各种常用类.以及正则表达式md

    1.基本数据类型包装类 1.01基本类型包装类的概述 需求: a:将100转换成二进制 , 八进制 , 十六进制 b:判断一个数是否在int的范围内 if(25252525>=Integer.M ...

  3. app_process执行java文件(三十五)

    app_process执行java文件 Demo:https://github.com/zgj224/Android-Demo/tree/master/app_process_exec_java_de ...

  4. WebGL入门(三十五)-三维物体雾化效果,立方体雾化效果

    立方体雾化效果 1. demo效果 2.相关知识点 2.1 雾化相关概念 2.2 雾化因子计算 2.3 片元颜色计算 3.实现要点 3.1 计算顶点与视点的距离 3.2 计算雾化后片元颜色 3.3 计 ...

  5. 三十五、深入Java中的泛型(下篇)

    @Author:Runsen @Date:2019年10月26日 17:10:34 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件 ...

  6. 【零基础学Java】—System类(三十五)

    [零基础学Java]-System类(三十五) java.lang.System 类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作 在System类的API文档中,常用的方法有: pub ...

  7. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  8. Java学习笔记(三十五)

    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度.现在将跟着视频做的笔记进行整理.本篇博客是整理Java知识点的第三十五 ...

  9. Gradle 1.12用户指南翻译——第三十五章. Sonar 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  10. [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

最新文章

  1. LabVIEW图像灰度分析与变换(基础篇—4)
  2. H5前端性能测试快速入门
  3. 【PHP 每日函数】第 03 周期
  4. AVP 6目GoPro全景拼接
  5. find排除文件 linux_Linux下find一次查找多个指定类型文件,指定文件或者排除某类文件,在 GREP 中匹配多个关键...
  6. NIO和BIO如何影响应用程序的设计-设置处理线程数
  7. static_cast
  8. 请先设置tkk_理光MP2014扫描至文件夹的设置方法
  9. 【C语言】输入一个正整数,判断其是否为素数
  10. Java读带有BOM的UTF-8文件乱码原因及解决方法(转)
  11. ARM64体系结构与编程之cache必修课(下)
  12. linux 图片处理工具,linux的convert图片处理工具
  13. 工程数学 傅里叶变换 狄拉克函数
  14. RealityCapture摄影测量软件
  15. 工具说明书 - FTDI芯片的USB转UART串口线
  16. 压力传感器压力变送器如何选型
  17. PXE实现系统批量自动安装
  18. 【智驾深谈】一张图看清自动驾驶产业
  19. 为WebApi项目添加注册功能:问题与解决的思维流程
  20. ccs是轮_CCS系统简介

热门文章

  1. chmod chown
  2. 哔哩哔哩Allen老师通用后台管理系统
  3. 2018 中兴事件的启示
  4. 学计算机的,有点悲哀
  5. kali dpkg无法访问归档
  6. EXCEL通俗易懂讲公式(一):sumif,sumifs,countif,countifs
  7. 计算机中sumif函数的使用方法,WPS中sumif函数用法与模糊条件使用方法
  8. google云盘资料大文件下载
  9. 【电子学会】2022年09月图形化一级 -- 踢足球
  10. Android ART Oat文件格式简析(下)