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()); }
a. 概述:数据结构是红黑树 特点:元素唯一,而且还能对元素进行排序 :自然排序和比较器排序
b. 特点:
(1)不能插入null键
(2)实现排序的前提是实现了Comparable<Integer> 接口 重写了里面的CmcompareTo(T o) 比较此对象与指定对象的顺序。
注意比较器排序时可以使用匿名内部类的方法(实现compare方法)
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): 随机置换
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(); } } }
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); } } }
c. 换行:
对于windows操作系统来说:换行符号:\r\n 对于Linux操操作系统来说:\n 对于Mac操作系统来说:\r
c. 关闭资源:close方法