1.冒泡排序
- 分析
- 代码实现
package com.a;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public class demo1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int arr[] = new int[6];
int temp;
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "个数字:");
arr[i] = sc.nextInt();
}
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
2.选择排序
- 图解
- 代码
package com.a;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public class demo2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int arr[] = new int[6];
int temp;
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "个数字:");
arr[i] = sc.nextInt();
}
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
3.二分查找法
-
二分查找前提条件
- 序列必须是已经排好序的
- 不考虑元素重复的情况
-
图解
- 代码实现
package com.a;
public class demo3 {
public static void main(String[] args) {
int arr[] = {12, 33, 45, 67, 78, 90, 123};
int a = 11;
System.out.println(month(arr, a));
System.out.println("");
}
private static int month(int[] arr, int a) {
int i = 0;
int j = arr.length - 1;
while (i <= j) {
int mid = (i + j) / 2;
if (a == arr[mid]) {
return mid;
} else if (a < arr[mid]) {
j = mid - 1;
} else if (a > arr[mid]) {
i = mid + 1;
}
}
return -1;
}
}
4.异常
1.异常的概念
异常就是程序出现了不正常的情况。异常分为了编译期异常和运行期异常。
2.异常的分类
Throwable
Error(错误)
Exception(异常)
编译期异常
除了RuntimeException以外的其他异常
在编译期间有红色波浪线报错。
运行期异常
RuntimeException以及他的子类
在编译期间没有显示,在运行过程才显示在控制台
//编译期异常
//日期格式化类
//String s = "1999-09-09";
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//Date date = sdf.parse(s);
//运行期异常
//String s = "abc";
//System.out.println(s.charAt(10));
3.见过的异常
索引越界异常
IndexOutOfBoundsException
空指针异常
NullPointerException
类型转换异常
ClassCastException
并发修改异常
ConcurrentModificationException
解析异常
ParseException
5.异常的产生
-
格式
throw new 异常对象();
-
代码举例
package com.b; public class Student { //姓名 private String name; //年龄 private int age; //set get public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { //如果年龄小于0或者大于150产生异常 if(age<0 || age>150){ throw new RuntimeException("年龄不能为"+age); } this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class Test02 { public static void main(String[] args) { //创建学生对象 Student s = new Student(); //赋值 s.setName("柳岩"); s.setAge(-38); //打印 System.out.println(s); } }
6.异常的处理【重点】
异常分为编译期异常和运行期异常。
编译期异常必须处理才能解决红线的问题
运行期异常一般不需要处理,因为运行期异常一般是代码写错了。
1.处理方式一:声明抛出异常throws
-
作用
- 解决编译期异常的报红线问题
-
格式
定义方法时: public static void method() throws 异常类型1,异常类型2{ } 声明抛出异常类型
-
注意事项
- 声明抛出异常是抛给了调用者,谁调用这个方法谁就要解决这个异常。
-
代码演示
package com.b; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test01 { public static void main(String[] args) throws ParseException { //编译期异常 //日期格式化类 String s = "1999-09-09"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(s); //运行期异常 //String s = "abc"; //System.out.println(s.charAt(10)); } }
2.处理方式二:捕获异常try…catch
-
格式
try{ 可能出现异常的代码; }catch(异常类型 异常对象名){ 捕获异常之后处理代码; } 在处理异常之后,程序会继续向下执行
-
代码演示
public class Test04 { public static void main(String[] args) { //编译期异常 //日期格式化类 try { String s = "1999-09-09"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); Date date = sdf.parse(s); }catch (ParseException e){ System.out.println("异常捕获了"); } System.out.println(1); } }
-
异常中的常用方法,可以在catch中使用
方法 说明 getMessage() 获取报错原因 toString() 获取报错的类型和原因 printStackTrace() 直接打印报错的类型、原因和位置 - 代码演示
package com.b; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test04 { public static void main(String[] args) { //编译期异常 //日期格式化类 try { String s = "1999-09-09"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); Date date = sdf.parse(s); }catch (ParseException e){ //String message = e.getMessage();//获取异常信息 //System.out.println(message); //String s = e.toString(); //获取异常信息和类型 //System.out.println(s); //e.printStackTrace(); //打印异常信息,类型,位置 } } }
3.注意事项
-
运行时异常在运行之前看不到,所以可以不处理。运行时异常如果出现了通常都是要修改自己的代码,即不捕获try…catch也不声明抛出throws。
-
异常是有多态的,遵从多态的使用
-
在方法重写时,子类方法的异常必须小于等于父类方法的异常。
-
当多异常分别处理时,捕获处理,前边的类不能是后边类的父类。
package com. b; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test06 { public static void main(String[] args) { try { String s = "1999-09-09"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(s); FileInputStream fis = new FileInputStream("sldfj"); }catch (ParseException e){ System.out.println(1); } catch (FileNotFoundException e){ System.out.println(2); } catch (Exception e){ //其他异常都用这个catch来解决 //这个catch只能放在最后 } System.out.println(3); } }
4.finally块
-
作用
- finally语句块中的代码是一定会执行的代码,除非退出虚拟机。
-
格式
try{ }catch{ }finally{ 代码是一定会执行的。 }
-
代码演示
package com.b; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test07 { public static void main(String[] args) { //编译期异常 //日期格式化类 String s = "1999-09-09"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = sdf.parse(s); System.out.println(1); //System.exit(0); 结束虚拟机,程序里面结束 //return; 结束方法finally也会执行 } catch (ParseException e) { System.out.println(2); }finally { //一定会执行的代码 //finally用来执行释放资源的代码 System.out.println(3); } } }
-
使用场景
要把释放内存资源的代码放在finally里面,让内存空间被释放。
7.自定义异常
-
查看异常源码
- 发现每个异常除了类名不同以外,没有自己的特殊功能。
- 类名不同能够让程序员知道报错的类型找到报错的原因。
-
自定义异常的作用
- 让报错信息更加明确。
-
代码演示
package com.b; //运行时异常 public class AgeOutOfBoundsException extends RuntimeException{ //构造方法 public AgeOutOfBoundsException() { super(); } public AgeOutOfBoundsException(String s) { super(s); } } public class Student { //姓名 private String name; //年龄 private int age; //set get public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { //如果年龄小于0或者大于150产生异常 if(age<0 || age>150){ throw new AgeOutOfBoundsException("年龄不能为"+age); } this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class Test02 { public static void main(String[] args) { //创建学生对象 Student s = new Student(); //赋值 s.setName("柳岩"); s.setAge(-38); //打印 System.out.println(s); } }
8.多线程
1.并行与并发
-
并行:多个任务同时执行,一起执行。
-
并发:在同一时间段内,多个任务都在执行,不同时执行。
计算机中,一个CPU是以并发的方式在执行多个任务。
2.进程与线程
- 进程:一个应用程序的一次启动就是一个进程。
- 线程:线程是进程中的一条执行单元,一个进程可以有多个线程。
3.Thread类
Thread是线程类,可以用这个类开启多个线程。
9.创建线程方式【重点】
1.继承方式
-
步骤
- 创建子类继承Thread类
- 重写run()方法,在run()里面写代码
- 在测试类中创建子类对象
- 调用开启线程的方法start()方法
-
代码演示
package com.b;
public class demo3 {
public static void main(String[] args) {
AAA a = new AAA();
a.start();
for (int j = 0; j < 1000; j++) {
System.out.println("k=" + j);
}
}
}
package com.b;
//线程类
public class AAA extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("i=" + i);
}
}
}
2.实现方式
-
步骤
- 创建子类实现Runnable接口
- 重写run()方法
- 创建子类对象
- 创建线程对象,将子类对象传入构造方法
- 调用线程的开启方法start()
-
代码演示
package com.b;
public class BBB implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("i="+i);
}
}
}
package com.b;
public class demo4 {
public static void main(String[] args) {
BBB b=new BBB();
Thread t=new Thread(b);
t.start();
for (int k = 0; k < 1000; k++) {
System.out.println("k="+k);
}
}
}
3.设置和获取线程名称
继承方式:
设置线程名:
setName();
获取线程名:
getName();
实现方式:
设置线程名:
setName();
获取线程名:
Thread.currentThread().getName();
4.匿名内部类写法
-
匿名内部类的方式继承Thread类
//继承方法 Thread t = new Thread(){ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("线程一" + i); } } }; //开启 t.start();
-
匿名内部类的方式实现了Runable接口
package com.c;
public class demo5 {
public static void main(String[] args) {
/* Runnable r=new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
}
};
Thread t=new Thread(r);
t.start();*/
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
}).start();
}
}