【Java笔记】Week08

xiaoxiao2021-02-28  45

一.写在前面的部分

本周主要学习了双列集合Map集合,异常类,File类和IO流。

二.双列集合

1.HashMap集合

a. Map接口:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 

Map<key,value>

b. 子实现类:HashMap:底层数据结构哈希表 特点:元素无序 且唯一 元素唯一 是靠元素重写 equlse方法和hashCode方法

TreeMap:底层数据结构是二叉树 它能够对元素进行排序 排序对元素有要求 要求元素实现 Comparable<T>接口

LinkedTable:底层数据结构是链表和哈希表 链表保证元素有序,哈希表保证元素唯一

HashTable:HashMap非同步的 效率高 数据不安全 Hashtable同步的 效率第 数据安全

c. 常用功能:

(1)添加功能:

 put(key,value) : 第一次添加该值,返回null;后面放置键相同的数据时,返回上一次的值

(2)删除功能:

clear():移除所有对应元素

remove(key):移除键对应的元素

(3)判断功能:

containsKey(key):判断是否包含指定键

containsValue(value):判断集合是否包含指定的值

isEmpty():判断集合是否为空

(4)获取功能:

entrySet() :public Set<Map.Entry<K,V>> entrySet() :返回一个键值对的Set集合.

get(key):V get(Object key):根据键获取值

keySet(): Set<K> keySet():获取集合中所有键的集合

values():Collection<V> values():获取集合中所有值的集合

d. HashMap集合的遍历:

(1)keySet()和get(key):

Set<String> keySet = hm.keySet(); for (String key : keySet) { System.out.println(key + "====" + hm.get(key).getName() + "--" + hm.get(key).getAge()); }(2)entrySet():

Entry<key,value>:是HashMap集合中键值对对象,是一个接口

Set<Entry<String, Student>> entrySet = hm.entrySet(); for (Entry<String, Student> en : entrySet) { String key = en.getKey(); Student stu = en.getValue(); System.out.println(key + "==" + stu.getName() + "--" + stu.getAge()); }

2.LinkedHashMap

a. 概述: Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序 b.特点:  底层的数据结构是链表和哈希表 元素有序 并且唯一

3.TreeMap

a. 概述:数据结构是红黑树 特点:元素唯一,而且还能对元素进行排序 :自然排序和比较器排序

b. 特点:

(1)不能插入null键

(2)实现排序的前提是实现了Comparable<Integer> 接口 重写了里面的CmcompareTo(T o) 比较此对象与指定对象的顺序。

注意比较器排序时可以使用匿名内部类的方法(实现compare方法)

4.集合工具类

a. 概述:Collections类,针对collection集合

b. 常用功能:

(1)public static <T> void sort(List<T> list): 排序,默认按照自然顺序

(2)public static <T> T max(Collection<?> coll): 获取最大值

(3) public static void reverse(List<?> list): 反转

(4)public static void shuffle(List<?> list): 随机置换

二.IO流

1.异常类

a. 概述: (1)Throwable:Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。 (2)Throwable的两个子类:Errow和Exception.其中Error表示严重错误,Exception是异常类。

b. 分类:

(1)编译时期异常:只要不是RuntimeException中的异常都属于编译时期异常:比如:IOException(IO流中的),ParseException(解析异常)出现的原因:要么语法有问题,要么使用的是Sun公司提供的一些类的中的方法,(这个方法本身调用的时候就会异常存在),调用者必须处理,不处理不行,需要编译通过

(2)运行时期异常:RuntimeException可能由于我们代码的逻辑不够严谨导致的问题举例,NullPointerException:空指针异常!需要个对象进行非空判断,来防止该问题的出现!

c. 处理方法:

(1)捕获异常:try...catch...finally

public class ExceptionDemo2 { public static void main(String[] args) { //定义两个变量 int a = 10 ; int b = 0 ; int[] arr = {1,2,3} ; //输出 try { //try中:是可能会出现问题的代码 System.out.println(a/b); //针对问题给出具体的异常类: } catch (Exception e) { // e.printStackTrace(); System.out.println("除数不能为0"); } System.out.println("over"); } }

出现多个异常的时候

   try{   可能会出现问题的多个语句   }catch(异常类名1 变量名){   输出语句处理   }catch(异常类名2 变量名){   输出语句处理   }

private static void method3() { int a = 10 ; int b = 0 ; int[] arr = {1,2,3} ; try{ //可能出现问题的代码 System.out.println(arr[3]); System.out.println(a/b); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("您访问了数组中不存在的索引"); }catch(ArithmeticException e){ System.out.println("除数不能玩为0"); }catch(Exception e){ System.out.println("程序可能出现问题了"); } System.out.println("over"); } //多个异常一块进行处理,只要try语句中的代码和catch语句中的代码所描述的异常类的信息一致,那么直接走catch里面的代码,try...catch语句结束 private static void method2() { //定义变量以及数组 int a = 10 ; int b = 0 ; int[] arr = {1,2,3} ; try{ //可能出现问题的代码 System.out.println(arr[3]); System.out.println(a/b); }catch(ArithmeticException e){ System.out.println("除数不能为0"); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("您访问了数组中不存在的索引"); } System.out.println("over"); } //针对多个异常分别的进行try...catch private static void method1() { //定义一个变量 int a = 10 ; int b = 0 ; //第一个异常 try { System.out.println(a/b); } catch (ArithmeticException e) { //输出语句处理 System.out.println("除数不能为0"); } //定义一个数组 int[] arr = {1,2,3} ; try{ System.out.println(arr[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("您访问了数组中不存在的索引"); } System.out.println("over"); } } package org.westos_02; /** * 针对多个异常进行处理,Jdk7以后又一种新的处理方式: * try{ * //可能会出现问题的代码 * //.... * //... * }catch(异常类名1 | 异常类名2 ....变量名){ * 处理异常... * } * 这个格式的注意事项: * 1)针对多个异常类名之间是一种平级关系 * 2)这种格式在实际开发中,虽然有多个异常,但是针对具体的异常给出具体的处理! * @author Apple */ public class ExceptionDemo4 { public static void main(String[] args) { //定义变量及数组 int a = 10 ; int b = 0 ; int[] arr = {1,2,3} ; try{ System.out.println(a/b); System.out.println(arr[3]); }catch(ArithmeticException | ArrayIndexOutOfBoundsException e){ // System.out.println("程序出问题了..."); e.printStackTrace() ; } System.out.println("over"); } }

(2)抛出异常:throws

1)在方法声明上抛出异常,由于,编译时期异常,调用者必须要处理

2)throws和throw的区别

  throws:抛出   后面跟的异常类名,可以跟多个异常类名,中间用逗号隔开   throws在方法声明上抛出,表示异常的一种可能性   由调用者去处理   throws表示抛出异常的一宗可能性   throw:抛出   后面跟的异常对象(匿名对象),只能跟具体的一个异常对象   throw在方法中的语句中抛出,表示异常的绝对性   有方法中某些语句处理

3)

public class ExceptionDemo3 { public static void main(String[] args) throws ParseException,ArithmeticException{ //告诉调用者,抛出异常了,所以这里必须处理 method(); try { method2(); } catch (Exception e) { e.printStackTrace(); } } //throw private static void method2() throws Exception { int a = 10 ; int b = 0 ; if(b==0){ System.out.println(a/b); throw new ArithmeticException() ;//跟的异常对象 }else{ System.out.println("不会出现问题"); } } private static void method() throws ParseException { String str = "2017-11-19" ; //创建SimpleDataFormat对象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ; //解析 Date d = sdf.parse(str) ; System.out.println(d); } }

d. 常用方法:

(1)public String getMessage():消息字符串

(2)public String toString():

(3)public void printStackTrace():最常用

e. finally

(1)finally经常用在数据库中或者IO流中,用来释放资源的

(2)finally中代码一定会执行

(3)面试题

package org.westos_04; /** * 面试题: * 如果catch里面有return语句,那么finally中的代码还会执行吗? * 如果可以,是在return前执行还是return后执行? * 会执行;并且在return 前执行! * * @author Apple */ public class FinallyDemo2 { public static void main(String[] args) { System.out.println(getInt()); } //方法 private static int getInt() { int a = 10 ; try{ System.out.println(a/0); a = 20 ; }catch(ArithmeticException e){ a = 30 ; return a ; /** * 代码走到这里,return a,return 30 ,在这里形成了一个方法返回路径 * 但是,finally中代码只有在Jvm退出了,才不会执行,所以a = 40 ; * 但是,由于之前已经返回路径,代码就要执行到return 前; */ }finally{ a = 40 ; } return a; } }

f. 自定义异常类:

(1)构造方法:

无参构造和传入字符串

public class MyException extends Exception { public MyException(){ } public MyException(String message){ super(message) ; } } package org.westos_05; /** * 老师类,提供一个方法 * @author Apple */ public class Teacher { public void check(int score) throws MyException{ //针对分数进行判断 if(score>100 || score<0){ throw new MyException("分数应该在0和100之间") ; }else{ System.out.println("分数的值属于正确范围..."); } } package org.westos_05; import java.util.Scanner; //测试类 public class StudentDemo { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in) ; System.out.println("请您输入一个分数:"); int score = sc.nextInt() ; //创建Teacher对象 Teacher t = new Teacher() ; try { t.check(score) ; } catch (MyException e) { e.printStackTrace(); } } }

2.File类

a.概述: 是用来描述文件或者目录(文件夹)的路径的抽象表现形式 b. 构造方法: (1)public File(String pathname):给定路径名以字符串来表示当前这个文件或者文件夹(开发中推荐使用第一种构造方法) (2)public File(String parent,String child)根据 parent 路径名字符串和 child 路径名字符串创建一个新 File对象  (3)public File(File parent, String child)根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例

c. 常用方法:

(1)public boolean mkdir()创建此抽象路径名指定的目录(文件夹)。(如果当前某个盘符下已经有了这个目录(文件夹),不会在创建了.)

(2)public boolean createNewFile():创建文件的,如果已经有这个文件了,不在创建,并且该方法本身就会编译时期异常IOException) throws IOException

(3)public boolean mkdirs()创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。(创建文件夹,文件夹不存在,才开始创建)

(4)public boolean delete()删除此抽象路径名表示的文件或目录

注意事项:

1)删除不能删除带有文件或者文件夹的目录

2)多个目录要逐一删除

(5)public boolean renameTo(File dest)重新命名此抽象路径名表示的文件。 

注意事项:

1)使用这个功能:当两个抽象路径一致,那么只是重命名

2)当这两个抽象路径不一致,有剪切并且改名了...

public class FileDemo2 { public static void main(String[] args) { //现在要描述当前项目下有一个高圆圆.jpg File file = new File("高圆圆.jpg") ; //使用重命名功能:文件名称该成:杨桃.jpg File file2 = new File("杨桃.jpg") ; //调用功能 file.renameTo(file2) ; //需求:将当前项目下的杨桃.jpg--->复制到e:\\高圆圆.jpg File file3 = new File("杨桃.jpg") ; //E:\\高圆圆.jpg File file4 = new File("E:\\高圆圆.jpg") ; file3.renameTo(file4) ; } }

(6)判断功能:

1)public boolean isDirectory():判断是否是文件夹 经常用到

2)public boolean isFile():判断是否是一个标准文件 经常用到

3)public boolean canRead():判断是否可读

4)public boolean isHidden():判断是否是隐藏文件

5)public boolean canWriter():判断是否可写

6)public boolean isAbsolute():判断次路径名是否是绝对路径

(7)获取功能:

1)public File getAbsolutePath():获取当前文件或者文件夹绝对路径

2)public String getPath():获取相对路径

3)public long length()返回由此抽象路径名表示的文件的长度

4)public long lastModified()返回此抽象路径名表示的文件最后一次被修改的时间.

5)public String getName():获取名称

6)public String[] list():返回对象是一个字符串数组,当前哪个一盘符下的所有的文件以及文件夹的字符串名称数组

7)public File[] listFiles():返回对象是一个File数组,当前哪个盘下的所有的文件以及文件夹的File数组

package org.westos_05; import java.io.File; /** * File类的高就获取功能: * public String[] list():返回对象是一个字符串数组,当前哪个一盘符下的所有的文件以及文件夹的字符串名称数组 * public File[] listFiles():返回对象是一个File数组,当前哪个盘下的所有的文件以及文件夹的File数组 * @author Apple */ public class FileDemo { public static void main(String[] args) { //需求:获取e盘下所有的文件夹以及文件的字符串名称数组 //用File对象封装下e盘 File file = new File("E:\\") ; public String[] list() String[] strArray = file.list() ; //遍历:遍历之前,一定要做非空判断 if(strArray!=null){ //增强for遍历 for(String s:strArray){ System.out.println(s); } } System.out.println("------------------------------------------"); //public File[] listFiles(): File[] fileArray = file.listFiles() ; if(fileArray !=null){ for(File f :fileArray){ System.out.println(f.getName()); } } } }

d. 应用举例:

判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称

package org.westos_05; import java.io.File; import java.io.FilenameFilter; /** * 判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称 * * 方式1:封装,然后获取所有的文件以及文件夹的File数组,遍历,判断...输出 * 方式2:在获取的时候就已经满足条件 * * 引出:文件名称过滤器 -------Javaweb中将过滤器以及上传和下载. * public String[] list(FilenameFilter filter) * public File[] listFiles(FileFilter filter) * * 参数是一个接口,(开发中使用的接口的匿名内部类的方式) * 实现一个方法: * boolean accept(File dir, String name):这个方法的返回值是true(就是表示要将当前文件夹或者文件的名称添加数组中),false(表示不添加数组中) * @author Apple */ public class FileTest2 { public static void main(String[] args) { //1)封装e盘 File file = new File("e:\\") ; //2)public String[] list(FilenameFilter filter) String[] strArray = file.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { // return false; //该逻辑是需要根据需求来判断的 //该方法中的返回值是需要我们自己判断的,根据需求做逻辑判断 /*File file = new File(dir, name) ; //判断File是否是文件 boolean flag1 = file.isFile() ; //如果是文件,还要判断是否以".jpg"结尾 boolean flag2 = name.endsWith(".jpg") ; return flag1 && flag2 ;*/ return new File(dir,name).isFile() && name.endsWith(".jpg") ; } }); //遍历字符串数组 for(String s : strArray){ System.out.println(s); } } }

3.IO流

a. 字节输出流:FileOutputStream b. 写入操作: (1)public abstract void write(int b):将指定的字节写入到输出流中(通过String的getBytes方法得到Bytes数组) (2)public void write(byte[] b):将指定的字节数组写入到输出流中 (3)public void write(byte[] b, int off,int len):将字节数组的一部分写入到输出流中 (4)public FileOutputStream(File file,boolean append):第二个参数设置为true,表示写入文件的末尾处 追加写入数据

c. 换行:

   对于windows操作系统来说:换行符号:\r\n   对于Linux操操作系统来说:\n   对于Mac操作系统来说:\r

c. 关闭资源:close方法

转载请注明原文地址: https://www.6miu.com/read-2299973.html

最新回复(0)