天天看点

JavaSE基础复习巩固

第八天: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());
        }
    }
}      

集合总结,如图:

JavaSE基础复习巩固

遍历:

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小时学习时间,当然你可以根据自己的自身情况安排。最后一句话:天道酬勤,相信你的付出终会有回报。