Java入门(三十五)
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集合的操作:
- 获取所有键的集合,用keySet()方法实现
- 遍历键的集合,获取到每一个键,用增强for可以实现。
- 根据键找值,用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)
获取所有结婚证的集合
遍历结婚证的集合,得到每一个结婚证
根据结婚证后去丈夫和妻子
思路
- 获取所偶有键值对对象的集合,使用entrySet方法,Map.Entry可以看做是一个键值对对象,他包含了K和V。
- 用增强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),存储三个键值对元素,并遍历。
- 思路:
- 定义学生类
- 创建HashMap集合对象
- 创建学生对象
- 把学生添加到集合
- 遍历集合 :①根据键找值 ②键值对对象找键和值
- 定义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集合底层数据结构是哈希表,主要是用来保证键的唯一性,所以学生对象里面要重写两个方法。
- 思路:
- 定义学生类
- 创建HashMap集合对象
- 创建学生对象
- 把学生添加到集合
- 遍历集合
- 在学生类中重写两个方法保证键的唯一性: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,并遍历。
- 思路:
- 创建ArrayList集合
- 创建HashMap集合,并添加键值对元素
- 把HashMap作为元素添加到ArrayList集合
- 遍历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,并遍历。
- 思路:
- 创建HashMap集合
- 创建ArrayList集合,并添加元素
- 把ArrayList作为元素添加到HashMap集合
- 遍历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入门(三十五)相关推荐
- [转]周易入门三十五问答
周易入门三十五问答 http://mt.sohu.com/20150714/n416782382.shtml 1.问:何谓<周易>? 答:<周易>是我国古代哲学.自然科学与社会 ...
- java入门~第十五天 基本数据类型包装类,各种常用类.以及正则表达式md
1.基本数据类型包装类 1.01基本类型包装类的概述 需求: a:将100转换成二进制 , 八进制 , 十六进制 b:判断一个数是否在int的范围内 if(25252525>=Integer.M ...
- app_process执行java文件(三十五)
app_process执行java文件 Demo:https://github.com/zgj224/Android-Demo/tree/master/app_process_exec_java_de ...
- WebGL入门(三十五)-三维物体雾化效果,立方体雾化效果
立方体雾化效果 1. demo效果 2.相关知识点 2.1 雾化相关概念 2.2 雾化因子计算 2.3 片元颜色计算 3.实现要点 3.1 计算顶点与视点的距离 3.2 计算雾化后片元颜色 3.3 计 ...
- 三十五、深入Java中的泛型(下篇)
@Author:Runsen @Date:2019年10月26日 17:10:34 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件 ...
- 【零基础学Java】—System类(三十五)
[零基础学Java]-System类(三十五) java.lang.System 类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作 在System类的API文档中,常用的方法有: pub ...
- JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!
JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...
- Java学习笔记(三十五)
在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度.现在将跟着视频做的笔记进行整理.本篇博客是整理Java知识点的第三十五 ...
- Gradle 1.12用户指南翻译——第三十五章. Sonar 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
最新文章
- LabVIEW图像灰度分析与变换(基础篇—4)
- H5前端性能测试快速入门
- 【PHP 每日函数】第 03 周期
- AVP 6目GoPro全景拼接
- find排除文件 linux_Linux下find一次查找多个指定类型文件,指定文件或者排除某类文件,在 GREP 中匹配多个关键...
- NIO和BIO如何影响应用程序的设计-设置处理线程数
- static_cast
- 请先设置tkk_理光MP2014扫描至文件夹的设置方法
- 【C语言】输入一个正整数,判断其是否为素数
- Java读带有BOM的UTF-8文件乱码原因及解决方法(转)
- ARM64体系结构与编程之cache必修课(下)
- linux 图片处理工具,linux的convert图片处理工具
- 工程数学 傅里叶变换 狄拉克函数
- RealityCapture摄影测量软件
- 工具说明书 - FTDI芯片的USB转UART串口线
- 压力传感器压力变送器如何选型
- PXE实现系统批量自动安装
- 【智驾深谈】一张图看清自动驾驶产业
- 为WebApi项目添加注册功能:问题与解决的思维流程
- ccs是轮_CCS系统简介