Lambda表达式
匿名内部类:为了防止过多 没有本身作用的类出现,就只是为了重写一些抽象方法,可以定义为匿名内部类
Lambda表达式 : 可以简化匿名内部类
前提: 函数式接口
函数式接口: 只有一个抽象方法的接口
强制检查函数式接口: @FunctionalInterface
@FunctionalInterface
interface Swimming{
String swim(int a);
}
语法:
() -> {}
() : 匹配要重写的抽象方法的参数列表
-> : lambda符号,箭头符号,具有上下文推到的作用
{} : 匹配要重写的抽象方法的方法体
//{}中的语句只有一句,并且是return返回值的语句,前后{}+return关键字都可以省略
Swimming s=x->"哈哈"+x;
System.out.println(s.swim(5));
异常
Error: 一般是由虚拟机生成并脱出的,程序不关注
Exception : 异常,一旦出现异常,如果不解决,程序无法继续向下执行
检查时异常|编译时异常:编译期出现的异常,如果不处理,程序无法运行
运行时异常: 出现在程序运行期间,可以通过程序的健壮性处理
异常处理:
- throw : 制造异常
- 处理异常的方式:
- throws : 抛出异常
- try…catch :捕获异常
try {
可能会出现异常的代码;
} catch (FileNotFoundException e) {
如果出现这个异常会执行的代码;
e.printStackTrace(); //打印异常的栈信息,标红色的打印异常信息
} catch (NullPointerException e){
如果出现这个异常会执行的代码;
}.....
finally{
无论是否出现异常,都会执行finally中的代码
}
如果一旦try中出现异常了,try中后面的代码都不会执行了
一个try后面可以跟一个或者多个catch
如果多个catch,大范围的在后面
public static void main(String[] args) {
try {
hehe();
String str="abc";
System.out.println(str.length());
System.out.println(5/0);
System.out.println("try中的代码执行完了...");
} catch (FileNotFoundException e) {
System.out.println("这是文件未找到异常了...");
e.printStackTrace();
} catch (NullPointerException e){
System.out.println("空指针异常");
} catch (Exception e){
System.out.println("接盘侠出现了...");
} finally{
System.out.println("最后的最后我们都会离开");
}
System.out.println("我才是程序的最后");
}
public static void hehe() throws FileNotFoundException{
InputStream is=new FileInputStream("D:/test.txt");
}
Console结果
java.io.FileNotFoundException: D:\test.txt (系统找不到指定的文件。)
这是文件未找到异常了...
最后的最后我们都会离开
我才是程序的最后
二维数组
二维数组: 了解
-
数组中还是数组
-
数组的声明
-
数据类型 数组名[][] -----------推荐;
-
数据类型[] 数组名[];
-
数组的初始化
-
动态初始化:先创建后赋值
-
数据类型[][] 数组名 = new 数据类型[一维的长度][二维的长度];
-
数据类型[][] 数组名 = new 数据类型[一维的长度][];
-
其中内层数组可以使用一维数组的常见方式
-
静态初始化:创建的同时赋值
-
数据类型[][] 数组名 = new 数据类型[][]{{1,2,3},{1,2},{1},{2,2}...};
-
数据类型[][] 数组名 = {{1,2,3},{1,2},{1},{2,2}...};
-
第一次创键并且赋值可以使用简易写法
-
遍历:
-
双重循环嵌套
-
操作二维数组中的数据:
-
数组名[一维索引][二维索引]
//二维数组的声明
int[][] arr1;
//二维数组的初始化
//动态初始化
arr1= new int[3][2];
arr1[0][0]=1;
arr1[0][1]=2;
arr1[1][0] =3;
arr1[1][1] =4;
arr1[2][0] =5;
arr1[2][1] =6;
//双重for循环遍历
for(int i=0;i<=arr1.length-1;i++){
for(int num:arr1[i]){
System.out.println(num);
}
}
arr2=new int[2][];
arr2[0] = new int[3];
arr2[0][0] = 0;
arr2[0][1] = 1;
arr2[0][2] = 2;
arr2[1]=new int[]{4,5,6,7};
for(int[] arr:arr2){
for(int i:arr){
System.out.println(i);
}
}
Arrays的常用方法
//toString(Object[] a) 返回指定数组内容的字符串表示形式
Arrays.toString(arr)
//deepToString(Object[] a) 返回指定数组“深层内容”的字符串表示形式。
Arrays.deepToString(arr2)
//equals(Object[] a, Object[] a2) 如果两个指定的 Objects 数组彼此相等,则返回 true。
Arrays.equals(arr, arr3)
//deepEquals(Object[] a1, Object[] a2)如果两个指定数组彼此是深层相等 的,则返回 true。
Arrays.deepEquals(arr2, arr4)
Arrays.toString(Arrays.copyOf(arr, 3))
Arrays.copyOf(arr, 3)//截取或者填充
Arrays.toString(Arrays.copyOfRange(arr, 1,3))
//copyOfRange(T[] original, int from, int to)将指定数组的指定范围复制到一个新数组。
Arrays.copyOfRange(arr, 1,3)
//fill(Object[] a, Object val) 将指定的 Object 引用分配给指定 Object 数组的每个元素。
Arrays.fill(arr3, "哈哈");
//fill(Object[] a, int fromIndex, int toIndex, Object val) 将指定的 Object 引用分配给指定 Object 数组指定范围中的每个元素。
Arrays.fill(arr3,1,2, "呵呵"); //结束索引没有包含
/* static void sort(char[] a)
对指定的 char 型数组按数字升序进行排序。
static void sort(char[] a, int fromIndex, int toIndex)
对指定 char 型数组的指定范围按数字升序进行排序。
*/
int[] arrs={3,1,7,4,6,2};
System.out.println("原数组:"+Arrays.toString(arrs));
Arrays.sort(arrs);
System.out.println("原数组:"+Arrays.toString(arrs));
/*前提 要求: 先升序排序才可以
* static int binarySearch(int[] a, int key)
使用二分搜索法来搜索指定的 int 型数组,以获得指定的值。
*/
System.out.println("原数组:"+Arrays.toString(arrs));
System.out.println("原数组:"+Arrays.binarySearch(arrs,-1)); //(-插入点 )-1
可变参数
可变参数: 方法的参数数据类型一致,参数个数不确定,可以有可以没有,可以有多个
- 1.数据类型 … 参数名 可变参数
- 2.自动在方法内部为可变参数构建数组,存储0~多个数据
- 3.如果参数列表中存在多个 参数,可变参数一定要放在参数列表的最后位置
public static void main(String[] args) {
getSum(1,2,3,4,5,6);
}
static void getSum(int num,int...i){//可变参数 参数可以是0~多个,但是都是int类型
int sum=0;
for(int j=0;j<=i.length-1;j++){
sum+=i[j];
}
System.out.println(sum);
System.out.println(num);
System.out.println(Arrays.toString(i));
}