第八天:Map集合(接口) 异常类(Exception)
Map:双列集合最顶层,它是以键值对的方式存储数据的。
Map<k,v> k:key(键) v:value(值) key:value
key(键):是唯一的, 一个键只能对应一个值,但是一个值可以对应多个键
value:是可以重复的。
添加数据用put(Object key,Object value)
注意:1.当映射的某条数据的key在集合中已存在时,会把原先的value覆盖掉,并且返回的是被覆盖的value。
2.当映射的某条数据的key在集合中已不存在时,这条数据可以直接添加到集合中,并且返回null。
HashMap(底层:数据加链表+哈希表+红黑树)
1.1 Map接口概述
我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同。
A:Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储
B:Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
C:Collection中的集合称为单列集合,Map中的集合称为双列集合。
需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
1.1.1 hashMap的使用(常用方法)
A:添加功能:
V put(K key, V value) :以键=值的方式存入Map集合
B:获取功能:
V get(Object key):根据键获取值
int size():返回Map中键值对的个数
C:判断功能:
boolean containsKey(Object key):判断Map集合中是否包含键为key的键值对
boolean containsValue(Object value):判断Map集合中是否包含值为value键值对
boolean isEmpty():判断Map集合中是否没有任何键值对
D:删除功能:
void clear():清空Map集合中所有的键值对
V remove(Object key):根据键值删除Map中键值对
例子:
package com.swlz.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo2 {
public static void main(String[] args) {
/* A:添加功能:
V put(K key, V value) :以键=值的方式存入Map集合
B:获取功能:
V get(Object key):根据键获取值
int size():返回Map中键值对的个数
C:判断功能:
boolean containsKey(Object key):判断Map集合中是否包含键为key的键值对
boolean containsValue(Object value):判断Map集合中是否包含值为value键值对
boolean isEmpty():判断Map集合中是否没有任何键值对
D:删除功能:
void clear():清空Map集合中所有的键值对
V remove(Object key):根据键值删除Map中键值对
E:遍历功能:
Set<Map.Entry<K,V>> entrySet():将每个键值对封装到一个个Entry对象中,再把所有Entry的对象封装到Set集合中返回*/
//创建集合
Map<String,String> map=new HashMap<>();
map.put("001","詹三");
map.put("002","李似");
map.put("003","王无");
// V get(Object key):根据键获取值
System.out.println(map.get("001"));
// int size():返回Map中键值对的个数
System.out.println(map.size());
/* C:判断功能:
boolean containsKey(Object key):判断Map集合中是否包含键为key的键值对*/
System.out.println(map.containsKey("002"));//true
// boolean containsValue(Object value):判断Map集合中是否包含值为value键值对
System.out.println(map.containsValue("张三"));//false
// boolean isEmpty():判断Map集合中是否没有任何键值对
System.out.println(map.isEmpty());//false
/* D:删除功能:
void clear():清空Map集合中所有的键值对*/
// map.clear();
// System.out.println(map);
// V remove(Object key):根据键值删除Map中键值对
System.out.println(map.remove("003"));
/* E:遍历功能:
Set<Map.Entry<K,V>> entrySet():将每个键值对封装到一个个Entry对象中,再把所有Entry的对象封装到Set集合中返回*/
// Set<Map.Entry<String, String>> entries = map.entrySet();
}
}
1.2 map集合的遍历(重点)
第一种方式用keySet
package com.swlz.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo3 {
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("001","张三");
map.put("002","李四");
map.put("003","王五");
//遍历Map集合 第一种方式keyset
Set<String> keys = map.keySet();//得到map集合中所有的key
// 然后在去遍历所有的key,通过key得到对应的value值
for (String key : keys) {//得到map集合中所有的key
String value = map.get(key);//通过map集合中的key得到对应的value值
System.out.println("key"+key+":"+"value:"+value);
}
}
}
第二种方式entrySet
package com.swlz.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo4 {
public static void main(String[] args) {
Map<String,String> map=new HashMap<>();
map.put("001","张三");
map.put("002","李四");
map.put("003","王五");
//遍历Map集合 第二种方式entrySet() map.entrySet()
//获取所有的键值对entrys 里面有相应的getkey和getvalue方法 Map的内部类Entry 相当于一个类 里面封装了getkey和getvalue方法
Set<Map.Entry<String, String>> entrys = map.entrySet();//通过getkey和getvalue方法,得到对象的key和value
//遍历所有的键值对,拿到键和值
for (Map.Entry<String, String> entry : entrys) {
System.out.println("键:"+entry.getKey()+" "+"值:"+entry.getValue());//通过getkey和getvalue方法,得到对象的key和value
}
}
}
1.3Map集合存储自定义类数据
package com.swlz.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo5 {
public static void main(String[] args) {
//创建HashMap集合 自定义对象作为key的时候 考虑去重 重写自定义类中的Object的hashcode和equals方法即可。
HashMap<Student, String> map = new HashMap<>();
Student s1 = new Student("张三", 19);
Student s2 = new Student("李四", 18);
Student s3 = new Student("王五", 28);
Student s4 = new Student("赵六", 20);
Student s5 = new Student("钱七", 22);
map.put(s1,"001");
map.put(s2,"002");
map.put(s3,"003");
map.put(s4,"004");
map.put(s5,"005");
Set<Map.Entry<Student, String>> entries = map.entrySet();
for (Map.Entry<Student, String> entry : entries) {
System.out.println(entry.getKey()+" "+entry.getValue());
}
}
}
集合总结,如图:
遍历:
for(元素的类型 变量 : 集合或者数组对象) {
可以直接使用变量;
}
这个list,set都可以使用
它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。
2.异常(Exception)类
异常:平时敲代码的时候出现的bug
2.1异常:Exception处理的第一种方式
jvm处理----很不友好,很暴力
直接把Exception的相关信息(异常的类型,异常的原因 异常的位置)打印出来
异常后面的代码是执行不了的。
int i=10/0;
int[] arr=new int[2];
System.out.println(arr[5]);
System.out.println("后面的代码继续执行");
2.2异常:Exception处理的第二种方式
捕捉处理---先捕捉到异常,再去处理异常
因为有时候,我们的代码并不一定会存在异常
格式:
try{
//有可能出现异常的代码-----尝试捕捉异常
}catch(异常的类型 e){
//处理异常的相关操作
注意: 在try块中,如果存在异常,那么异常后面的代码也不能执行,会直接跳到catch块中
package com.bianyiit.exception;
import java.text.SimpleDateFormat;
public class ExceptionDemo4 {
public static void main(String[] args) {
//第二种方式
try{
System.out.println(1);
int a=0;
int i=10/a;
System.out.println(2);
}catch (ArithmeticException e){
//处理异常
System.out.println(3);
System.out.println("出现数学异常了.....");
}
System.out.println(4);
}
}
2.3异常处理的第三种方式:抛异常
编译时期(可以存在异常的代码)----把异常抛出来------抛到方法声明上面 ------谁调用此方法谁就处理这个异常
异常三个常用的方法:
String getMessage() 返回此 throwable 的详细消息字符串
String toString() 返回此 throwable 的简短描述
void printStackTrace() 打印异常的堆栈的跟踪信息
例子:
package com.bianyiit.exception;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class ExceptionDemo6 {
public static void main(String[] args) throws Exception {
/*异常处理的第三种方式:抛异常
* 编译时期(可以存在异常的代码)----把异常抛出来------抛到方法声明上面 ------谁调用此方法谁就处理这个异常
*
* */
/* SimpleDateFormat sdf = new SimpleDateFormat("yyyy--MM--dd");
//字符串
String s = "2020:08--12";
sdf.parse(s);//throws ParseException*/
/* method1();*/
People p1 = new People();
p1.method2();
}
public static void method1() throws Exception{
int a=0;
int i=10/a;
}
}
除了以上我们还可以自定义异常:类
2.4finally:用来释放资源
用法:
}catch(异常类型 e){
处理异常的操作;
}finally{
一定要执行的操作;比如:释放连接资源
目的,就是连接资源创建之后,不管有没有发生异常,连接资源必须释放
除了挂掉虚拟机,fnally块中的内容一定会执行
finally一定要结合try...catch使用吗?不一定,还可以try{}finally{}
今日学习感受:其实java基础前面还是很简单,首先你要学会用,把java该掌握的核心技术,要做到熟练使用,然后在去深入研究,打好基础很重要,希望自己不忘初心,继续坚持,当然也要劳逸结合,一天24小时,我们可以这样按8小时睡觉,8小时自由安排时间,8小时学习时间,当然你可以根据自己的自身情况安排。最后一句话:天道酬勤,相信你的付出终会有回报。