220802-多线程
多线程概念程序程序是指令的有序集合。是一个在时间上按照严格次序前后相继的操作序列。
进程进程是指运行中的程序,进程是程序的一次执行过程,或者是正在运行的一个程序
线程线程是由进程创建的,是进程的一个实体;一个进程可以拥有多个线程
单线程:同一时刻,只允许执行一个线程
多线程:同一时刻,可以执行多个线程
并发:同一时刻,多个任务交替执行
并行:同一时刻,多个任务同时执行
进程与程序的主要区别:
程序是永存的;进程是暂时存在的。即进程是有生命周期的,创建,执行,撤销等。
程序是静态的观念,进程是动态的观念;
进程和程序不是一一对应的: 一个程序可对应多个进程; 一个进程可以执行一个程序或多个程序
进程具有并发性,而程序没有;
进程是竞争计算机资源的基本单位,程序不是。
线程的基本使用创建线程的三种方式
继承Thread类,并重写run方法
实现Runnable接口,重写run方法
通过 Callable 和 Future 创建线程
继承Thread类Thread类中的run方法不是抽象方法,Thread不是抽象类
当某类继承Thread类后,它就是一个独立的线程
要让线程启动,调用st ...
220801-泛型
泛型泛型,即“参数化类型”。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法
泛型的好处
对于集合的使用更为规范
使用了泛型就解决了元素不确定性
编译时,检查添加元素的类型,提高安全性
减少了类型转换的次数,提高效率
泛型的使用12345678910/* 1.interface<T>{},class HashSet<E>{} 说明:T、E只能是引用类型 2.在指定泛型具体类型后,可以传入该类型或者其子类类型 3.泛型使用形式 List<Integer> list1 = new ArrayList<Integer>(); List<Integer> list2 = new ArrayList<>(); 如果List list2 = new ArrayList();这样写 默认给它的 泛型是<E> E就是Object*/
自定义泛型类泛型类就是一个具有 ...
220729-异常
异常Exception基本概念Java语言中,将程序执行中发生的不正常情况称为“异常”(开发过程中的语法错误和逻辑错误不是异常)
执行过程中所发生的异常事件可分为两大类
Error(错误)::Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:栈溢出。Error是严重错误,程序会崩溃
Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
Exception分为运行时异常和编译时异常
运行时异常,编译器检查不出来。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常
对应运行时异常,可以不作处理,若全处理可能会对程序的可读性和运行效率产生影响
编译时异常,是编译器要求必须处置的异常
运行时异常
NullPointerException空指针异常
ArithmeticException数学运算异常
ArrayIndexOutOfBoundsException数组下标越界异常
ClassCastException类型转换异常
NumberFormatException数字格式不正确异常
编译异常编译异常是 ...
220728-常用类
日期类
LocalDate:只包含日期,可以获取日期字段
LocalTime:只包含时间,可以获取时间字段
LocalDateTime:包含日期和时间,可以获取日期和时间字段
DateTimeFormatter:格式日期类
Instant:时间戳
1234567891011121314151617181920212223242526272829303132333435public class LocalDate_ { public static void main(String[] args) { //第三代日期 //1. 使用now() 返回表示当前日期时间的 对象 LocalDateTime ldt = LocalDateTime.now(); //LocalDate.now();//LocalTime.now() System.out.println(ldt); //2. 使用DateTimeFormatter 对象来进行格式化 // 创建 DateTi ...
220727-内部类
内部类一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类,嵌套其他类的类称为外部类。是我们类的第五大成员(属性、方法、构造器、代码块、内部类),内部类最大特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。
基本语法:
12345678910111213141516class Outter{//外部类 private int n1 = 100;//属性 public void m1(){//方法 System.out.println("m1()"); } {//代码块 System.out.println("代码块"); } class Inner{//内部类,在Outter类的内部 }}class Other{ //外部其他类 }
内部类的分类定义在外部类局部位置上:
局部内部类(有类名)
匿名内部类(没有类名)
定义在外部类的成员位置上:
成员内 ...
220726-抽象接口
抽象类abstract当父类的某些方法,需要声明,但又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类
当一个类中存在抽象方法(没有方法体)时,需要将该类声明为abstract
抽象类的价值更多作用是在于设计,让子类继承并实现
抽象类的细节及讨论
抽象类不一定要包含抽象方法,可以有实现的方法
abstract只能修饰类、方法
抽象类不能被实例化
抽象类可以有任意成员(本质还是类)
抽象方法不能有主体
如果一个类继承了抽象类,则必须实现抽象类中的所有方法
抽象方法不能使用private,final,static来修饰,因为这些关键字与重写相违背
接口接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来
语法:
123456789interface 接口名{ //属性 //方法}class 类名 implements 接口{ //自己属性; //自己方法; //必须实现的接口的抽象方法}
jdk7前 接口里的所有方法都没有方法体
jdk8后 接口类可以有静态 ...
队列
队列Queue
队列是一个有序列表,可以用数组或者链表来实现
遵循先进先出的原则
maxSize为队列最大容量
front表头;rear表尾
队列的声明123456789101112class ArrayQueue{ private int maxSize;//数组最大容量 private int front;//表头 private int rear;//表尾 private int[] arr;//存放数据模拟队列}//创建队列的构造器public ArrayQueue(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[maxSize];front = -1; // 指向队列头部,分析出 front 是指向队列头的前一个位置. rear = -1; // 指向队列尾,指向队列尾的数据(即就是队列最后一个数据)}
判断队列是否已满isFull123public boolean isFull() { return rear == maxSize ...
LeetCode刷题笔记
1.两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
初步思路暴力破解:使用双层循环一一遍历对比
时间复杂度为O(n^2),空间复杂度为O(1);
运行完后执行用时54ms,感觉差了很多。使用双重循环时间复杂度大,最坏情况是最后两位数相加等于target。
1234567891011public int[] towSum(int[] nums,int target){ int n = nums.length; for (int i = 0; i < n; i++) { for (int j = i+1; j < n ; j++) { if (nums[i]+nums[j]==target){ retu ...
220725-多态
多态方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础之上的。
多态的具体表现
方法的多态:重写和重载就体现多态
对象的多态 核心,困难,重点
注:
一个对象的编译类型和运行类型可以不一致
编译类型在定义对象时就确定了,不能改变
运行类型是可以变化的
编译类型看定义时 = 的左边;运行类型看 = 的右边
多态的注意事项和细节讨论多态的前提是:两个对象(类)存在继承关系
多态的向上转型
本质:父类的引用指向了子类的对象
语法: 父类类型 引用名 = new 子类类型();
编译类型看左边;运行类型看右边
可以调用父类中的所有成员(需遵守访问权限)
不能调用子类中的特有成员
最终运行效果看子类的具体实现 (先从子类寻找,子类没有去父类找)
多态向下转型
语法:子类类型 引用名 = (子类类型)父类引用;
只能强转父类的引用,不能强转父类的对象
要求父类的引用必须指向的是当前目标类型的对象
当向下转型后,可以调用子类类型中所有的成员
属性没有重写之说,属性的值看编译类型
instanceOf比较操作符
用于判断对 ...
220723-面向对象
final关键字final表示不可改变
采用final修饰的类不能被继承
采用final修饰的方法不能被覆盖
采用final修饰的变量不能被修改
final修饰的变量必须显示初始化
如果修饰的引用,那么这个引用只能指向一个对象,也就是说这个引用不能再次赋值,但被指向的对象是可以修改的
构造方法不能被final修饰
抽象类采用abstract关键字定义的方法就是抽象方法,abstract定义的类就是抽象类
抽象的方法只需在抽象类中,提供声明,不需要实现
如果一个类中含有抽象方法,那么这个类必须定为抽象类
如果这个类是抽象的那么这个类被子类继承,抽象方法必须重写。如果在子类中不复写该抽象方法,那么必须将此类再次声明为抽象类
抽象的类是不能实例化的
抽象类不能被final修饰
抽象方法不能被final修饰
接口接口可以看作是抽象类的一种特殊情况,在接口中只能定义抽象方法和常量
在java中接口采用interface声明
接口中的方法默认都是public abstrac的,不能更改
接口中的变量默认都是public static final类型的,不能更改,所以必须显示的初始化
接口 ...