描述:当程序没有按程序员的意愿正常执行时,中途出错导致程序中断,就称为异常
异常分类图:
如果一个异常属于RuntimeException异常类的子类,称为运行时异常,可以通过编译,运行时可能抛出异常对象。
如果一个异常属于Exception异常类的子类,称为非运行时异常,无法通过编译,只有处理后才能编译运行。
常见异常原因:
处理异常的方法
方式一:try-catch-finally语句
方式二:throws关键字
集合特点
可以无需也可以有序,集合的容量可变,集合中可以保存不同的数据
集合家族
ArrayList实现类
常用方法
LinkedList实现类
常用方法
ArrayList和LinkedList的区别
ArrayList采用数组实现,对于随机读取效率更高,通常用于查询;LinkedList采用双向链表实现,插入删除不影响其他元素位置,通常用于中间插入删除。
Set接口
TreeSet实现类:
采用红黑树(自平衡二叉树)实现的集合
常用方法
HashMap实现类
常用方法
泛型
描述:一种规范,常用语限制集合中元素的类型,省去遍历元素时的转型的过程
用法:在定义集合时,在接收集合变量的数据类型后,写上<数据类型>
流用于表示计算机硬盘和内存之间传输数据的通道
流的分类:
InputStream**字节输入流
FileInputStream文件字节输入流 ObjectInputStream对象字节输入流(反序列化)**
OutputStream字节输出流
FileOutputStream文件字节输出流 ObjectOutputStream对象字节输出流(序列化)**
Writer字符输出流
FileWriter文件字符输出流 **BufferedWriter缓冲字符输出流(包装流) ** OutputStreamWriter字节输出流转换为字符输出流(转换流)
Reader字符输入流
FileReader文件字符输入流 BuffedredReader缓冲字符输入流(包装流) InputStreamReader字节输入流转换为字符输入流(转换流)
FIleInputStream文件字节输入流
常用方法:
FIleOutputStream文件字节输出流
常用方法:
ObjectOutputStream对象字节输出流(序列化)
序列化:将对象转换为文件的过程
被序列化的对象,必须要实现Serializable接口。
这个接口是一个特殊的接口,没有定义方法,只是给这个类打上标记,表示该类可以被序列化
常用方法:
**
**
线程是一个进程中的执行单元,一个进程中可以有多个线程。
多线程之间,可以访问同一个进程中的资源。
每个线程都有一个独立的栈空间。这些线程所在的栈空间位于同一个进程空间中。
多线程
如果一个进程中,同时在执行着多个线程,就称为多线程。
其实每个执行的Java程序,都是多线程的,虽然看似只有main方法所在的主线程在执行,其实还有一个gc线程(守护线程)。
如有一个工厂,工厂中有很多车间,车间中有很多流水线。
工厂就是内存,车间就是各个进程,拥有一块属于该进程的内存空间,每个流水线都是一个线程,属于对应进程下的一块子空间。
同步和异步
所有的任务排队执行,称为同步执行。–同步
在执行任务A的同时,执行任务B,称为异步执行。–异步
常用方法
实现多线程
方式一:继承Thread类
1.让某个类成为Thread类的子类
2.重写Thread类中的run方法,将要让该线程执行的内容写在该方法中
3.创建Thread类的对象后,调用start()方法,启动线程
方式二:实现Runnable接口(建议使用)
由于Java中是单继承,所以如果某个类已经使用了extends关键字去继承了另一个类,这时就不能再使用extends继承Thread类实现多线程,就需要使用实现Runnable接口的方法实现多线程。
1.自定义一个类,实现Runnable接口
2.重写run方法,将要多线程执行的内容写在该方法中
3.创建Thread线程对象,将自定义的Runnable接口实现类作为构造方法的参数
4.调用线程对象的start()方法启动线程
方式三
使用匿名内部类
线程的生命周期
线程的初始化到终止的整个过程,称为线程的生命周期
新生状态
当线程对象被实例化后,就进入了新生状态。new Thread()
就绪状态
当某个线程对象调用了start()方法后,就进入了就绪状态。
在该状态下,线程对象不会做任何事情,只是在等待CPU调用。
运行状态
当某个线程对象得到运行的机会后,则进入运行状态,开始执行run()方法。
不会等待run()方法执行完毕,只要run()方法调用后,该线程就会再进入就绪状态。这时其他线程就有可能穿插其中。
阻塞状态
如果某个线程遇到了sleep()方法或wait()等方法时,就会进入阻塞状态。
sleep()方法会在一段时间后自动让线程重新就绪。
wait()方法只有在被调用notify()或notifyAll()方法唤醒后才能进入就绪状态。
终止状态
当某个线程的run()方法中所有内容都执行完,就会进入终止状态,意味着该线程的使命已经完成
线程死锁
线程操作是可能会遇到这个问题,这会导致程序不结束,也不执行,出现他的原因是synchronized的原因,意图同步资源,当2个类都在调用资源时,如果使用这个关键字交错使用,会导致A类要用资源的时候,B类也再用,因为synchronized不能把资源给A,B同样也不能用A的资源,就到导致双方都不能进行下去住了。解决方法有调用资源时采用相同的顺序,或者获取第三资源,对他进行同步。
这部分的内容相对于之前就要复杂困难很多了,但在一次次完成小作业之后,收获到的东西也是更多的,对于自己能力的提升也是很大的。线程的操作通过死锁对于他的概念更清楚了,知道他的操作逻辑。流的使用也让我可以操作文件,读取和写入他们。集合的使用相对于数组要方便很多,可以存储不同类型的数据,我会在之后的学习中让我这部分的知识更扎实。