选择排序
选择排序概述:选中数组中的某个元素,后面的元素依次和它进行比较,将较大的数据放在后面,依次从前到后选中每个元素,直到所有的数据按要求完成排序即可
选择排序的图解形式:
特点:选择排序,5个数字,需要排4次即可,所以如果是N个数字进行排序,那么需要排N-1次
代码实现:
public static void main(String[] args) {
int[] arr = {5, 2, 1, 6, 7, 9};
//外层循环控制选中的元素
for (int i = 0; i < arr.length - 1; i++) {
//外层循环控制和哪个元素进行比较
for (int j = i + 1; j < arr.length; j++) {
//比较arr[i] arr[j]
if (arr[i] > arr[j]) {
//交换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
二分查找
概念:给定的数组必须是有自然顺序的(比如,从小到大),然后和要查找的元素进行比对,如果相同就返回索引
代码实现:
public static void main(String[] args) {
//定义数组,必须是有序的
int key = 5;
int[] arr = {1, 5, 9, 12, 16, 75};
//调用方法
int index = find(arr, key);
System.out.println(index);
}
public static int find(int[] arr, int key) {
//定义两个变量
int left = 0;
int right = arr.length - 1;
while (left <= right) {
//获取中间索引元素和目标值比较
int middle = (left + right) / 2;
if (arr[middle] > key) {
right = middle - 1;
} else if (arr[middle] < key) {
left = middle + 1;
} else {
return middle;
}
}
return -1;
}
异常
什么是异常:在写程序或者运行程序时出现的非正常情况
异常的继承体系:所有异常的根类:Throwable ;子类有:Error(错误类)、Exception(异常类)
异常中常用的三个方法:
printStackTrace();打印异常的详细信息(包括异常的类型、原因及位置)【最常用】
getMessage();获取异常的原因
toString();获取异常信息和描述
异常(Exception)的分类
编译时异常:写好代码后,运行代码之前出现的异常。
编译时异常是**Exception以及Exception的子类**。(RuntimeException除外)
运行时异常:运行代码时出现的异常。
运行时异常是**RuntimeException以及RuntimeException的子类**
异常处理
五个关键字(throw、throws、try…catch、finally)
throw是一个关键字,想要向上抛出时使用
格式: throw 异常对象; throw new 异常类();
代码案例:
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int i = get(arr);
System.out.println(i);
}
public static int get(int[] arr) {
//自己判断,数组是否有3索引
if (arr.length < 4) {
//抛出异常
throw new ArrayIndexOutOfBoundsException("越界");
}
//获取数组中索引为3的元素
int num = arr[3];
//返回num
return num;
}
}
Objects中非空判断方法
objects是一个工具类,其中 Objects.requireNonNull();方法内部帮助我们判断是否为null。
throws声明抛出异常
throws关键字是给方法使用的,是为该方法做出声明,声明该方法内部编译时有异常,调用者需要处理该异常。
格式:public void 方法名(参数列表)throws XxxException{
一堆代码(如果这堆代码有编译时异常)
}
代码实现:
public static void main(String[] args) throws FileNotFoundException {
//调用方法
read("1.txt");
}
//定义一个方法,读取硬盘上的文件
public static void read(String name) throws FileNotFoundException {
if ("1.txe".equals(name)) {
//可以读取
System.out.println("读取成功");
} else {
//抛出异常
throw new FileNotFoundException("读取失败");
}
}
try…catch捕获异常
格式:try{ //可能出现的代码块 }catch (XxxException e){ //处理异常 e.printStackTrace();//打印异常 }
代码实现:
public static void main(String[] args) {
//调用方法
try {
read("1.txt");
} catch (FileNotFoundException e) {
//处理异常
System.out.println("出现异常");
e.printStackTrace();//打印异常
}
System.out.println("程序继续执行");
}
//定义一个方法,读取硬盘上的文件
public static void read(String name) throws FileNotFoundException {
if ("1.txe".equals(name)) {
//可以读取
System.out.println("读取成功");
} else {
//抛出异常
throw new FileNotFoundException("读取失败");
}
}
finally代码块
finally一般不能单独使用,配合try…catch使用
格式:try{ //可能出现的代码块 }catch (XxxException e){ //处理异常 e.printStackTrace();//打印异常 }finally { //写在finally的代码,无论是否异常,都会执行!! }
作用:一般用于写释放资源,关闭连接等代码
自定义异常
概述
我们自定义一个异常类,在适当的时候创建异常对象,并抛出。
步骤
第一步:创建一个类,必须叫XxxException的形式
第二步:继承Exception或者RuntimeException
第三步:一般需要提供两个构造,无参构造+带有String参数的构造
代码实现:
public class MyException extends RuntimeException {
//无参构造
public MyException() {
}
//带有异常信息的构造
public MyException(String message) {
//一定要把message保存下来
super(message);
}
}
案例
要求:我们模拟注册操作,如果用户名已存在,则抛出异常,提示该用户名已被注册。
pException.java
public class pException extends Exception {
public pException() {
}
public pException(String message) {
super(message);
}
}
测试类:
public class PTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String user = scanner.nextLine();
try {
register(user);
} catch (pException e) {
//异常处理
e.printStackTrace();
}
}
public static void register(String user) throws pException {
ArrayList<String> users = new ArrayList<>();
users.add("Tom");
users.add("jack");
if (users.contains(user)) {
//如果存在,则抛出异常提示已存在
throw new pException("用户已存在");
} else {
System.out.println(user + "用户名注册成功");
}
}
}
总结
排序
主要针对面试!
排序最优解:Arrays.sort(array);
异常
关于Interger类的方法:将一个字符窜转成int类型的数据!
public static int parseInt(String s) throws NumberFormatException
针对这个方法:如果这个字符串s里面不是数字,那么它在进行转换的过程中就会出现问题!异常它是在你执行某个功能的时候可能出现的问题!!!【一旦发生,我们程序是需要去处理的】
异常的处理
抛出异常throw【方法内部】
声明异常throws【在方法上面】
捕获异常try【方法内部】
提示
如果你的异常类继承了RuntimeException,那么在方法里面不用声明异常 throws 【当然也可以!】
如果你的异常类继承了Exception,那么在方法里面就需要声明异常 throws