Java&day07

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();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值