Java开发实践07-0130

本文详细介绍了Java集合框架中的Set(包括HashSet和TreeSet)和Map(包括HashMap和TreeMap)的使用,以及异常机制的基础概念、分类、避免、捕获、抛出和自定义异常的实例。通过实际代码展示了如何操作这些集合和处理异常情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、今日内容

1、集合框架

(1)Set集合

    ① 基本概念:java.util.set集合是Collection集合的子集合,与List集合平级。该集合中元素没有先后放入次序,并且不允许重复。

    ② 该集合的主要实现类是:HashSet类 和Treeset类。其中HashSet类的底层是采用哈希表进行数据管理的。其中TreeSet类的底层是采用二叉树进行数据管理的。

    ③ 常用的方法

参考Collection集合中的方法即可!

(2)Map集合

    ① 基本概念

java.util.Map集合中存取元素的基本单位是:单对元素;其中类型参数如下:

K  - 此映射所维护的键(Key)的类型,相当于目录。

V  - 映射值(Value)的类型,相当于内容。

该集合中key是不允许重复的,而目一个key只能对应一个value。

    ② 该集合的主要实现类有:HashMap类和TreeMap类。

    ③ 常用的方法

V put(K key, V value)- 将Key-Value对存入Map,若集合中已包含该Key,则替换该Key所对应Value,返回值为该Key原来所对应的Value,若没有则返回null
V get(Object key)- 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回null
boolean containsKey(Object key)- 如果此映射包含对于指定键的映射关系,则返回true
boolean containsValue(Object value)- 如果此映射将一个或多个键映射到指定值,则返回true
V remove(Object key)- 从此映射中移除指定键的映射关系(如果存在)

    ④ Map集合的遍历方式

      a. 方式一:自动调用toString方法

      b. 方式二:调用keySet方法获取Map集合中所有的key

      c. 方式三:调用entrySet方法获取Map集合中所有的键值对

    ⑤ Map集合是面向查询优化的数据结构,在大数据量情况下有着优良的查询性能,经常用于根据key检素value的业务场景。

2、异常机制

(1)基本概念

异常就是“不正常”的含义,有java语言中体现为运行阶段发生的错误。java.lang.Throwable类是java语言中所有错误(Error类)和异常(Exception类)的超类。其中Error类主要用于描述比较严重无法编码解决的错误,如:JVM挂了等。其中Exception类主要用于描述比较轻微可以编码解決的错误,如:0作为除数等。

(2)基本分类

    ① java.lang.Exception类的所有子类主要分为两大类:
      RuntimeException类  - 运行时异常,也叫做非检测性异常。
      IOException和其它异常  - 其它异常,也叫做检测性异常。
                   - 所谓检测性异常就是指在编译阶段能够被编译器检测出来的异常。


    ② 注意:当程序执行过程中发生了异常但没有手动处理时,该异常由java虛拟机采用默认方式处理,而默认处理方式就是打印异常的名称、异常的原因以及异常发生的位置并终止程序。

(3)异常的避免

在以后的开发中尽量使用if条件判断来避免异常的发生。

(4)异常的捕获

    ① 语法格式

try {

编写所有可能发生异常的语句;

}

catch(异常类型 变量名){

编写针对该类异常进行处理的语句;

}

finally {

编写无论是否发生异常都需要处理的语句;

}

    ② 注意事项

      a. 当编写多个catch分支时,切记将小类型放到大类型的前面,懒人的写法:

catch (Exception e) {

}
      b. finally主要用于善后处理,如:关闭已经打开的文件、删除临时创建的文件等。

    ③ 执行流程

try {

    a;

    b;   - 可能发生异常的语句

    c;

}

catch( ... ) {

    d;

}

finally {

    e;

}

当程序执行过程中没有发生异常时的执行流程:a b c d e;

当程序执行过程中发生异常后的执行流程:a b d e;

(5)异常的抛出

    ① 基本概念

在某些特殊情况下异常不便于处理或无法处理时,就可以将异常转移给该方法的调用者,这个过程就叫做异常的拋出。

(6)自定义异常

    ① 基本概念

虽然java官方提供了大量的异常类,但没有提供针对年龄不合理的异常,此时若希望描述这样的异常信息,就需要程序员自定义异常类。

    ② 实现流程

      a. 自定义xxException继承自Exception或者其子类。

      b. 提供两个版本的构造方法,一个是无参构造方法,另外一个是字符串作为参数的构造方法。

二、代码

1、SetTest

Set集合

import org.junit.Test;

import java.util.HashSet;
import java.util.Set;

/**
 * @Author: ydh 2303
 * @description: 准备一个Set集合指向HashSet对象;
 *               向集合中添加元素“one”并打印;
 *               向集合中添加元素“two”并打印;
 *               向集合中添加元素“three”并打印;
 *               向集合中添加元素“one”并打印。
 * @Date: 2024/1/30 8:15
 * @Version: 1.0
 */
public class SetTest {

    @Test
    public void setTest(){

        Set<String> set = new HashSet<>();

        boolean b = set.add("two");
        System.out.println("b = " + b); //true
        System.out.println(set); //two

        b = set.add("one");
        System.out.println("b = " + b); //true
        System.out.println(set); //[one, two]无序

        b = set.add("three");
        System.out.println("b = " + b); //true
        System.out.println(set); //[one, two, three]

        b = set.add("four");
        System.out.println("b = " + b);
        System.out.println(set);

        b = set.add("five");
        System.out.println("b = " + b);
        System.out.println(set);
        System.out.println("--------------------------");

        b = set.add("one");
        System.out.println("b = " + b); //false
        System.out.println(set);
    }
}

运行结果:

2、RandomSetTest

随机生成10个1~20之间的随机数放入Set集合中并打印。

import org.junit.Test;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

/**
 * @Author: ydh 2303
 * @description: 随机生成10个1~20之间的随机数放入Set集合中并打印。
 * @Date: 2024/1/30 8:43
 * @Version: 1.0
 */
public class RandomSetTest {

    @Test
    public void randomSetTest(){

        System.out.println("随机生成10个1~20之间的随机数:");
        //Set集合
        Set<Integer> set = new HashSet<>();
        //随机数
        Random random = new Random();

        //for循环(方法一)
        for (int i = 0; i < 10 ; i++){
            boolean b = set.add(random.nextInt(20) + 1);
            //判断是否相等
            if (b == false){
                i--;
            }
        }
        System.out.println(set);
        System.out.println("-------------------------");

        //while循环(方法二)
        while (true){
            int num = random.nextInt(20);
            set.add(num);
            if (set.size() == 10){
                break;
            }
        }
        System.out.println(set);
        System.out.println("-------------------------");

        while (set.size() < 10){
            set.add(random.nextInt(20) + 1);
        }
        System.out.println(set);
    }

}

运行结果:

3、MapTest

Map集合

import org.junit.Test;

import java.beans.IntrospectionException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @Author: ydh 2303
 * @description: Map集合
 *               常用方法
 *               V put(K key, V value)	                - 将Key-Value对存入Map,若集合中已包含该Key,则替换该Key所对应Value,返回值为该Key原来所对应的Value,若没有则返回null
 *               V get(Object key)	                    - 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回null
 *               boolean containsKey(Object key)	    - 如果此映射包含对于指定键的映射关系,则返回true
 *               boolean containsValue(Object value)	- 如果此映射将一个或多个键映射到指定值,则返回true
 *               V remove(Object key)	                - 从此映射中移除指定键的映射关系(如果存在)
 * @Date: 2024/1/30 9:49
 * @Version: 1.0
 */
public class MapTest {

    @Test
    public void hashMapTest(){
        System.out.println("Map常用方法:");
        Map<Integer, String> map = new HashMap<>();
        //向集合中添加元素
        System.out.println("1.向集合中添加元素:");
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(3,"王五");
        map.put(4,"赵六");
        System.out.println(map);
        System.out.println("-----------------------------");

        System.out.println("2.返回指定键所映射的值:");
        String value = map.get(3);
        System.out.println("3 = " + value);
        System.out.println("-----------------------------");

        System.out.println("3.此映射包含对于指定键的映射关系:");
        boolean b = map.containsKey(5);
        System.out.println(b); //false
        b = map.containsKey(2);
        System.out.println(b); //true
        System.out.println("-----------------------------");

        System.out.println("4.此映射将一个或多个键映射到指定值:");
        b = map.containsValue("斯坦尼斯拉夫斯基");
        System.out.println(b); //false
        b = map.containsValue("张三");
        System.out.println(b); //true
        System.out.println("-----------------------------");

        //删除Map集合中的元素
        System.out.println("5.删除Map集合中的元素:");
        String  v = map.remove(3);
        System.out.println("删除的值为:" + v); //王五
        v = map.remove(11);
        System.out.println("删除的值为:" + v); //null
    }

    @Test
    public void iteratorMapTest(){
        System.out.println("遍历Map:");
        Map<Integer, String> map = new HashMap<>();
        //向集合中添加元素
        map.put(1,"张三");
        map.put(2,"李四");
        map.put(3,"王五");
        map.put(4,"赵六");
        System.out.println(map);
        //遍历Map集合,方式一
        System.out.println("方式一:");
        System.out.println(map);
        System.out.println("-----------------------------");

        //遍历Map集合,方式二
        System.out.println("方式二:");
        Set<Integer> set = map.keySet();
        for (Integer it : set){
            System.out.println(it + "=" + map.get(it));
        }
        System.out.println("-----------------------------");

        //使用entrySet遍历Map集合中的元素,方式三
        System.out.println("方式三:");
        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        for (Map.Entry<Integer, String> e : entries){
            System.out.println(e);

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

运行结果:

4、Exception异常

(1)ExceptionTest01

异常机制--五种

package Exception01;

import org.junit.Test;

import java.io.IOException;

/**
 * @Author: ydh 2303
 * @description: 异常机制--五种
 * @Date: 2024/1/30 15:50
 * @Version: 1.0
 */
public class ExceptionTest01 {
    @Test
    public void exceptionTest(){
        //1.ArithmeticException 算数异常
        int a = 10;
        int b = 0;
        if (b != 0){
            System.out.println(a / b);
        }

        //2.ArrayIndexOutOfBoundsException 数组下标越界异常
        int[] arr = new int[5];
        int len = 5;
        if (len < arr.length) {
            System.out.println(arr[len]);
        }

        //3.NullPointerException 空指针异常
        String str = null;
        if (str != null) {
            System.out.println(str.length());
        }

        //4.ClassCastException 类型转换异常
        Exception exception = new Exception();
        if (exception instanceof IOException){
            IOException io = (IOException) exception;
            System.out.println(io);
        }

        //5.NumberFormatException 数字格式异常
        String str2 = "123aa";
        //匹配正则表达式 \d+表示数字
        if (str2.matches("\\d+")) {
            System.out.println(Integer.parseInt(str2));
        }

        System.out.println("程序终于执行完成了!");
    }
}

运行结果:

(2)ExceptionTest02

文件找不到异常

package ExceptionTest;

import org.junit.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @Author: ydh 2303
 * @description: 异常的捕获--流
 * @Date: 2024/1/30 16:01
 * @Version: 1.0
 */
public class ExceptionTest02 {
    @Test
    public void exceptionTest(){
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream("c:/a.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

(3)ExceptionTest03

电脑关机

package ExceptionTest;

import java.io.IOException;

/**
 * @Author: ydh 2303
 * @description: 电脑关机
 * 在某些特殊情况下异常不便于处理或无法处理时,就可以将异常转移给该方法的调用者,这个过程就叫做异常的拋出。
 * @Date: 2024/1/30 16:30
 * @Version: 1.0
 */
public class ExceptionTest03 {

    public static void main(String[] args) {
        try {
            exc();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void exc() throws IOException {
        Runtime.getRuntime().exec("shutdown -s -t 72000");
    }
}
(4)ExceptionTest04

算数异常

package ExceptionTest;

/**
 * @Author: ydh 2303
 * @description: 算数异常
 * @Date: 2024/1/30 17:27
 * @Version: 1.0
 */
public class ExceptionTest04 {
    public static void main(String[] args) {
        try {
            System.out.println(10 / 0);
            System.out.println("赚钱最重要!");
        }catch (ArithmeticException e){
            System.out.println("出异常了!");
            System.exit(0);
        }finally {
            System.out.println("我是finally,你看我有没有打印内容!");
        }
    }
}

运行结果:

(5)ExceptionTest05
package ExceptionTest;

/**
 * @Author: ydh 2303
 * @description:
 * @Date: 2024/1/30 17:33
 * @Version: 1.0
 */
public class ExceptionTest05 {

    public static void main(String[] args) {
        Person person = haha();
        System.out.println(person.age);
    }

    public static Person haha() {
        Person person = new Person();
        try {
            person.age = 10;
            return person;
        } catch (Exception e) {
            return null;
        } finally {
            person.age = 20;
        }
    }

//    public static void main(String[] args) {
//        int a = haha();
//        System.out.println(a);
//    }
//
//    public static int haha() {
//        int a = 10;
//        try {
//            return a;
//        } catch (Exception e) {
//            return 0;
//        } finally {
//            a = 20;
//        }
//    }

    //静态内部类
    static class Person{
        int age;
    }
}

运行结果:

5、自定义异常

编程实现Person类的封装,特征有:姓名和年龄,要求重写tostring方法;

编程实现PersonTest类,在main方法中使用有参方式构造对象并打印。

(1)Person
package ExceptionTest;

/**
 * @Author: ydh 2303
 * @description: 编程实现Person类的封装,特征有:姓名和年龄,要求重写tostring方法;
 *               编程实现PersonTest类,在main方法中使用有参方式构造对象并打印
 * @Date: 2024/1/30 16:34
 * @Version: 1.0
 */
public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) throws AgeException {
        setName(name);
        setAge(age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws AgeException {

//        if (age > 0 && age < 100) {
//            this.age = age;
//        } else {
//            this.age = 0;
//            System.out.println("年龄不合理");
//        }

        if (age > 0 && age < 100) {
            this.age = age;
        } else {
            throw new AgeException("年龄不合理!");
        }
    }

    @Override
    public String toString() {
        return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
}
(2)PersonTest
package ExceptionTest;

/**
 * @Author: ydh 2303
 * @description: 编程实现PersonTest类,在main方法中使用有参方式构造对象并打印
 * @Date: 2024/1/30 16:35
 * @Version: 1.0
 */
public class PersonTest {
    public static void main(String[] args) {
        Person person = null;
        try {
            person = new Person("张三", 20);
        } catch (AgeException e) {
            e.printStackTrace();
        }
        System.out.println(person);
    }
}
(3)AgeException
package ExceptionTest;

/**
 * @Author: ydh 2303
 * @description: 年龄异常
 * @Date: 2024/1/30 16:39
 * @Version: 1.0
 */
public class AgeException extends Exception {
    public AgeException() {
    }

    public AgeException(String message) {
        super(message);
    }
}

运行结果:

三、总结

今日学习了集合框架的剩余部分内容,主要学习了异常机制,有基本概念、基本分类、异常的避免、异常的捕获、异常的抛出、自定义异常等,还联系了很多,还要继续学习!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值