一、MapTest 1
package com.shujia.lhw.day21; import java.util.ArrayList; import java.util.List; public class Test1 { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("str1"); list.add(2,"str2"); String s = list.get(1); System.out.println(s); } }
---------------------------------------------------------------------------------------------------------------------------
二、MapTest 2
package com.shujia.lhw.day21; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; /* 使用List和Map存放多个图书信息,遍历并输出,其中商品属性:编号,名称,单价,出版社 使用商品编号作为Map中的key */ public class Test2 { public static void main(String[] args) { //List ArrayList<Goods> list = new ArrayList<>(); //创建图书信息 Goods g1 = new Goods("sj001","哈利波特",59,"清华出版社"); Goods g2 = new Goods("sj002","大话数据结构",39,"数加出版社"); Goods g3 = new Goods("sj001","数据中台",49,"十五期出版社"); Goods g4 = new Goods("sj001","人生清单",69,"清华出版社"); //添加元素到集合当中 list .add(g1); list.add(g2); list.add(g3); list.add(g4); //遍历 for (Goods g:list){ System.out.println(g); } System.out.println("=================================================="); //Map HashMap<String,Goods> map = new HashMap<>(); //添加键值对到Map中 map.put(g1.getId(),g1); map.put(g2.getId(),g2); map.put(g3.getId(),g3); map.put(g4.getId(), g4); //遍历 Set<Map.Entry<String,Goods>> entries = map.entrySet(); for (Map.Entry<String,Goods> keyValue : entries){ String key = keyValue.getKey(); Goods value = keyValue.getValue(); System.out.println(key+":"+value); } } }
package com.shujia.lhw.day21; //编号,名称,单价,出版社 public class Goods { private String id; private String name; private int price; private String press; public Goods() { } public Goods(String id, String name, int price, String press) { this.id = id; this.name = name; this.price = price; this.press = press; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getPress() { return press; } public void setPress(String press) { this.press = press; } @Override public String toString() { return "Goods{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", price=" + price + ", press='" + press + '\'' + '}'; } }
---------------------------------------------------------------------------------------------------------------------------------
三、MapTest 3
package com.shujia.lhw.day21; import java.util.*; /* 实现List和Map的数据转换。具体要求如下 功能1:定义方法public void listToMap(){}将List中Student元素封装到Map当中 1)使用构造方法Student(int id,String name,int age,String sex)创建多个信息并加入List 2)遍历List,输出每个Student信息 3)将List中数据放入Map,使用Student的id属性作为key,使用Student对象信息作为value 4)遍历Map,输出每个Entry的key和value 功能2:定义方法public void mapToList(){}将Map中Student映射信息封装到List 1)创建实体类StudentEntry,可以存储Map中的每个Entry信息 2)使用构造方法Student(int id,String name,int age,String sex)创建多个学生信息,并使用Student的id属性 作为key,存入Map 3)创建List对象,每个元素类型是StudentEntry 4)将Map中每个Entry信息放入List对象 */ public class Test3 { public static void main(String[] args) { //创建一个List集合 ArrayList<Student> list = new ArrayList<>(); //创建多个学生对象 Student s1 = new Student(1001, "关羽", 18, "男"); Student s2 = new Student(1002, "张飞", 17, "男"); Student s3 = new Student(1003, "马超", 19, "男"); Student s4 = new Student(1004, "赵云", 16, "男"); Student s5 = new Student(1005, "黄忠", 20, "男"); //添加元素到集合中 list.add(s1); list.add(s2); list.add(s3); list.add(s4); list.add(s5); Map<Integer, Student> map = listToMap(list); Set<Map.Entry<Integer, Student>> entries = map.entrySet(); for (Map.Entry<Integer, Student> keyValue : entries) { Integer key = keyValue.getKey(); Student value = keyValue.getValue(); System.out.println(key + ":" + value); } System.out.println("============================================"); List<StudentEntry> list1 = mapToList(map); for (StudentEntry se : list1){ Integer key = se.getEntry().getKey(); Student value = se.getEntry().getValue(); System.out.println(key+":"+value); } } public static Map<Integer, Student> listToMap(List<Student> list) { //创建一个Map对象 HashMap<Integer, Student> map = new HashMap<>(); //遍历List集合,获取每一个学生信息 for (Student s : list) { //将每一个学生对象的id作为map中key存储,学生对象作为value存储 map.put(s.getId(), s); } return map; } public static List<StudentEntry> mapToList(Map<Integer, Student> map) { //创建一个List集合 ArrayList<StudentEntry> list = new ArrayList<>(); //将Map中每一个Entry的信息放入到集合中 Set<Map.Entry<Integer, Student>> entries = map.entrySet(); for (Map.Entry<Integer,Student> entry : entries){ StudentEntry studentEntry = new StudentEntry(entry); list.add(studentEntry); } return list; } }
package com.shujia.lhw.day21; /* Student(int id,String name,int age,String sex) */ public class Student { private int id; private String name; private int age; private String sex; public Student() { } public Student(int id, String name, int age, String sex) { this.id = id; this.name = name; this.age = age; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } 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 String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}'; } }
package com.shujia.lhw.day21; import java.util.Map; public class StudentEntry { private Map.Entry<Integer,Student> entry; public StudentEntry() { } public StudentEntry(Map.Entry<Integer, Student> entry) { this.entry = entry; } public Map.Entry<Integer, Student> getEntry() { return entry; } public void setEntry(Map.Entry<Integer, Student> entry) { this.entry = entry; } @Override public String toString() { return "StudentEntry{" + "entry=" + entry + '}'; } }
-------------------------------------------------------------------------------------------------------------------------------
四、HashMapTest
package com.shujia.lhw.day21; import java.util.HashMap; import java.util.Map; import java.util.Set; /* 1、假如有以下email数据"aa@sohu.com,bb@163.com,cc@sina.com" 现需要把email中的用户部分和邮件地址部分分离,分离后以键值对的方式放入HashMap? */ public class Test4 { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); String s = "aa@sohu.com,bb@163.com,cc@sina.com"; //以逗号进行分割得到每一个邮箱 String[] strings = s.split(","); for (String youxiang : strings) { String[] strings1 = youxiang.split("@"); String name = strings1[0]; String address = strings1[1]; map.put(name, address); } Set<Map.Entry<String, String>> entries = map.entrySet(); for (Map.Entry<String,String> keyValue : entries){ String name = keyValue.getKey(); String address = keyValue.getValue(); System.out.println(name+":"+address); } } }
--------------------------------------------------------------------------------------------------------------------------------
五、TreeSetTest
package com.shujia.lhw.day21; import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class Test5 { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in); boolean flag = true; //创建TreeSet集合 TreeSet<Student2> set = new TreeSet<>(new Comparator<Student2>() { @Override public int compare(Student2 o1, Student2 o2) { // return 0; //主要条件年龄从小到大正序排序 int i = o1.getAge() - o2.getAge(); //年龄一样学号不一定一样 int i2 = i == 0 ? o1.getId() - o2.getId() : i; return i2; } }); while(flag){ System.out.println("是否要输入学生的信息:"); String next = sc.next(); if ("exit".equals(next)){ flag = false; }else{ System.out.println("请输入学生的学号:"); int id = sc.nextInt(); System.out.println("请输入学生的姓名:"); String name = sc.next(); System.out.println("请输入学生的年龄:"); int age = sc.nextInt(); //将来输入的信息封装成一个学生对象 Student2 student = new Student2(id,name,age); set.add(student); } } System.out.println("====================================================="); for (Student2 student2 : set){ System.out.println(student2); } } }
package com.shujia.lhw.day21; public class Student2 { private int id; private String name; private int age; public Student2() { } public Student2(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } 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; } @Override public String toString() { return "Student2{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
-------------------------------------------------------------------------------------------------------------------------------
六、ExceptionDemo1
package com.shujia.lhw.day21; /* 异常:指的是程序出现不正常的情况 举例:今天天气很好,班长出去爬大蜀山,其哈罗打车去,去山上呼吸新鲜空气 问题1:山路突然崩塌了,班长及时停住,但是路过不去了,这是属于严重的问题 问题2:班长开了一个哈罗单车,发现半路没电了,自己想办法充电,充完电后到了,这样的问题,班长在出发前就应该考虑到 问题3:班长骑着车正在欣赏风景,山路不太好骑车,都是小石子,中间是平坦的水泥路 如果一直在水泥路上骑车,这是厄密问题的,但是呢,班长偏偏不走那边,就喜欢走小石子路,结果半路车胎爆了 这样的问题属于上山过程中出现的问题 对应java中异常的分类: Java中的异常:Throwable 严重的问题:Error,我们不处理,这样的问题一般都是很严重的,比如说内存溢出(OOM) 问题:Exception(异常) 编译时期异常:除了RuntimeException都是编译时期的异常,必须要处理,如果不处理,程序编译无法通过,无法运行 运行时期异常:RuntimeException,这样的问题,一般情况下,我们不会对问题本身处理,因为这样的问题是自己在写代码过程中由于逻辑的不严谨 导致的 如果程序出现了问题,我们并且没有做任何处理,最终JVM会做出默认的处理 把异常的名称,相关的原因,以及问题的信息输出在控制台上 同时程序会停止,而且后续的代码不会执行 所以接下来我们要学习如何处理异常 */ public class ExceptionDemo1 { public static void main(String[] args) { int a = 10; // int b = 20; int b = 0; // System.out.println(a/b);//ArithmeticException if (b!=0){ System.out.println(a/b); } System.out.println(10); } }
--------------------------------------------------------------------------------------------------------------------------------
七、ExceptionDemo 2
package com.shujia.lhw.day21; /* 我么自己如何处理异常呢? 1、try...catch..finally 2、throws try...catch...finally的处理格式: try{ 可能会出现问题的代码 }catch(异常类名 变量名){ 针对问题出现后的处理代码 }finally{ 只要是程序顺利进行,finally里面的内容无论如何都会执行 } 变形格式: try{ 可能会出现问题的代码 }catch(异常类名 变量名){ 针对出现问题后的处理代码 } 注意事项: 1、try里面的代码越少越好 2、catch必须要有内容,哪怕是一句简单的提示 */ public class ExceptionDemo2 { public static void main(String[] args) { int a = 10; int b = 0; try{ System.out.println(a/b); }catch(ArithmeticException e){ System.out.println("除数为0..."); } System.out.println("over"); } }
---------------------------------------------------------------------------------------------------------------------------
八、Exception Demo 3
package com.shujia.lhw.day21; /* 1、处理一个异常的情况 2、处理两个及两个以上的异常情况 1)每一个异常写一个try...catch 2)写一个try,多几个catch try{ 可能会出现问题的代码 }catch(异常类名1 变量1){ 针对于异常1做的处理方案 }catch(异常类名2 变量名2){ 针对于异常2做的处理方案 }... 当处理多个异常使用第二种方案的时候需要注意的事项: 1、catch只能匹配对应的异常,并且只能匹配一个异常 2、平级关系的异常无所谓,如果出现了父子继承关系,父类必须先放在最后 3、try里面如果出错了,try后面的代码不会执行,就会匹配catch中的异常 匹配到后执行解决方案,后面的代码正常执行 4、catch中的异常类名,尽量明确,不要用大的异常处理 */ public class ExceptionDemo3 { public static void main(String[] args) { // fun(); // fun1(); fun2(); } public static void fun2(){ int a = 10; int b = 5; int[] arr = {1,2,3}; try { System.out.println(a / b);//走到这里报错了,try后面的代码不会执行,直接去匹配catch中的异常 System.out.println(arr[4]); }catch(ArrayIndexOutOfBoundsException a1) { System.out.println("除数为0.。。。"); }catch(ArithmeticException a2){ System.out.println("数组下标索引越界。。。"); } System.out.println("over3"); } public static void fun1(){ int a = 10; int b = 0; try{ System.out.println(a/b); }catch (ArithmeticException e){ System.out.println("除数为0.。。"); } System.out.println("over"); System.out.println("=========================================="); int[] arr = {1,2,3}; try{ System.out.println(arr[4]);//ArrayIndexOutOfBoundsException }catch (ArrayIndexOutOfBoundsException q){ System.out.println("数组下标越界。。。"); } System.out.println("over2"); } public static void fun(){ int a = 10; int b = 0; try{ System.out.println(a/b); }catch (ArithmeticException e){ System.out.println("除数为0.。。"); } System.out.println("over"); } }
--------------------------------------------------------------------------------------------------------------------------------
九、Exception Demo4
package com.shujia.lhw.day21; /* JDk1.7之后出现的处理多个异常的方式: try{ 可能会出现问题的代码 }catch(ArrayIndexOutOfBoundsException|ArithmeticException|...){ 处理问题的方案 } 注意事项: 1、处理方式是一致,这个方式虽然简洁,但是也不够好,针对多种数据结构的异常,只给出了一种解决方案 2、这样的方式,catch中只能写平级关系的异常类!!! */ public class ExceptionDemo4 { public static void main(String[] args) { fun(); } public static void fun(){ int a = 10; int b = 5; int[] arr = {1,2,3}; // try { // System.out.println(a / b);//走到这里,报错了,try后面的代码不会继续执行,直接去匹配catch中的异常 // System.out.println(arr[4]); // }catch (ArrayIndexOutOfBoundsException a1){ // System.out.println("除数为0.。。"); // }catch (ArithmeticException a2){ // System.out.println("数组下标索引越界。。。。"); // } try{ System.out.println(a/b); System.out.println(arr[4]); }catch (ArrayIndexOutOfBoundsException|ArithmeticException e){ System.out.println("出错了。。。。"); } System.out.println("over3"); } }
---------------------------------------------------------------------------------------------------------------------------------
十、Exception Demo5
package com.shujia.lhw.day21; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /* 编译时期的异常与运行时期的异常的区别: 编译时期的异常:Java程序必须要显示的处理,否则程序会发生错误,无法通过编译,不能运行 运行时期的异常:一般情况下不去做处理,修复代码逻辑,也可以和编译时期的异常做一样的处理 */ public class ExceptionDemo5 { public static void main(String[] args) { //日期转化 String s = "2022-02-16 15"; SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-ddHH:mm:ss"); try{ Date date = sdf.parse(s); System.out.println(date); } catch (ParseException e) { System.out.println("日期转换异常"); } System.out.println("over"); } }
-----------------------------------------------------------------------------------------------------------------------------
十一、Exception Demo6
package com.shujia.lhw.day21; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /* getMessage() 获取异常信息,返回字符串 toString() 获取异常类名和异常信息,返回字符串 返回此异常类名+":"+getLocalizedMessage() 而getLocalizedMessage()内部默认调用的是getMessage() printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void */ public class ExceptionDemo6 { public static void main(String[] args) { //日期转化 String s = "2022-02-16 15"; SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-ddHH:mm:ss"); try { Date date = sdf.parse(s); System.out.println(date); } catch (ParseException e) {//ParseException e = new ParseException(); String message = e.getMessage(); System.out.println(message);//UnparseException date:"2022-02-16 15" String s1 = e.toString(); System.out.println(s1);//java.text.ParseException:Unparseable date:"2022-02-16 15" e.printStackTrace(); } System.out.println("over"); } }
------------------------------------------------------------------------------------------------------------------------------
十二、Exception Demo7
package com.shujia.lhw.day21; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import static com.shujia.lhw.day21.ExceptionDemo3.fun2; /* 有些时候,我们可以对异常进行处理,但是有些时候,我们就根本没有权限去处理某个异常 处理不了,我们干脆不处理了 但是呢,我们不处理又报错,影响后面代码的执行 为了解决这样的问题,并且还能让程序继续执行,Java针对这种情况,提供了另一种处理异常方案:throws 抛出 语句定义格式: throws 异常类名 注意: 1、这个格式必须跟在方法的小括号后面,大括号的前面 2、尽量不要在main上面抛出 总结: 1、编译时期异常抛出,将来调用者必须做处理 2、运行时期异常抛出,将来调用者依旧要做处理 */ public class ExceptionDemo7 { public static void main(String[] args) throws ParseException{ System.out.println("今天天气真好"); // try{ // fun(); // }catch (ParseException p){ // p.printStackTrace(); // } // fun(); try{ fun2(); }catch (ArithmeticException e){ e.printStackTrace(); } System.out.println("可以出去郊游"); } public static void fun2() throws ArithmeticException{ int a = 10; int b = 0; System.out.println(a/b); } private static void fun() throws ParseException{ //日期转化 String s = "2022-02-16 15"; SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-ddHH:mm:ss"); Date date = sdf.parse(s); System.out.println(date); } }
---------------------------------------------------------------------------------------------------------------------------
十三、Exception Demo8
package com.shujia.lhw.day21; import java.text.ParseException; import static com.shujia.lhw.day21.ExceptionDemo3.fun; /* throw:在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出 注意:此时用throw抛出的是异常类的对象 throws与throw的区别: throws 用在方法声明后面,跟的是异常类名 可以跟多个异常类名,用逗号隔开 表示抛出异常,由该方法的调用者来处理 throws表示出现异常的一种可能性,并不一定会发生这些异常 throw 用在方法体内,跟的是异常对象名 只能抛出一个异常对象名 表示抛出异常,由方法体内的语句处理 throw则是抛出了异常,执行throw则一定抛出了某种异常 故事理解throws与throw: 假如你是一个快乐的小矿工,有一天正在挖矿,挖着挖着,挖出一枚二战时期遗留的炸弹(异常),怎么办呢? 肯定不能在矿井中就直接引爆(不能直接就处理了),所以应该传递出去(throw抛出异常对象)。然后你带着这个炸弹来到了矿井口,发现你们小队 挖的这块地方,是二战时期炸弹聚集地,所以理所当然会挖出炸弹,很多矿工都挖到了,都会传出来(throws,表示一次性可以跑出多个异常),传给 谁呢?传给的是矿井负责人(调用者)进行处理,大角度挖到了炸弹,为了区分,每个人都有权利给自己的炸弹命名(throw可以抛出自定义异常对象)。 */ public class ExceptionDemo8 { public static void main(String[] args) { try{ fun(); }catch (ArithmeticException e){ e.printStackTrace(); }catch (ParseException p){ p.printStackTrace(); } System.out.println("over"); } public static void fun() throws ArithmeticException,ParseException{ int a = 10; int b = 0; if (b==0){ System.out.println("hello"); throw new ArithmeticException(); }else { System.out.println(a/b); } } }
-------------------------------------------------------------------------------------------------------------------------------
十四、Exception Demo9
package com.shujia.lhw.day21; /* final,finally和finalize的区别: final:最终的意思,可以修饰类,成员变量,成员方法 修饰类:类不能被继承 修饰成员变量:变量变常量 修饰成员方法:方法不能被重写 finally:是属于处理异常try..catch..finally的一部分,一般是用于释放资源,正常情况下,都会执行,除非在finally之前,程序停止。 finalize:是Object类中一个方法,适用于垃圾回收的,堆内存中的空间没有栈的引用指向它,但是什么时候会受我们不确定 如果catch里面有return语句,请问finally的代码还会执行吗?会执行 如果会,请问是在return前还是在return后。在之间执行 */ public class ExceptionDemo9 { public static void main(String[] args) { System.out.println(getInt());//30 } public static int getInt(){ int a = 10; try{ System.out.println(a/0); a = 20; }catch (ArithmeticException e){ a = 30; return a;//走到这里就已经生成了一个返回路径 a = 30; }finally{ a = 40; System.out.println(a); // return a; } return a; } }
---------------------------------------------------------------------------------------------------------------------------------
十五、FinallyDemo
package com.shujia.lhw.day21; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /* finally:被finally控制语句体最终一定会执行,特殊情况除外 特殊情况:在执行finally控制语句体之前,JVM就退出了 格式:try...catch...finally */ public class FinallyDemo1 { public static void main(String[] args) { //日期转化 String s = "2022-02-16 16"; SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-ddHH:mm:ss"); Date date =null; try{ date = sdf.parse(s); }catch (ParseException e){ e.printStackTrace(); System.out.println(0);//让程序停止 }finally { //一般情况下,finally里面写的是用于 //IO操作和针对于数据库操作,经常遇见 System.out.println("这里的代码一定会执行"); } System.out.println(date); } }
---------------------------------------------------------------------------------------------------------------------------------