对象流:对象流指的是可以直接把一个对象以流的形式传输给其他的介质,如硬盘。
一个对象以流的形式进行传输,叫做序列化。该对象所对应的类,必须实现Serializable接口。
Collection是Set List Queue和Deque的接口。
Collection和Map之间没有关系,前者是放一个一个对象的,Map是放键值对的。
Collections是一个类。
HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式
区别1:HashMap可以存放null
Hashtable不可以存放null
区别2:前者线程不安全
后者线程安全
判断HashMap的key是否重复:
由两个步骤判断:
hashcode是否一样:
如果hashcode不一样则在不同的坑里,一定是不重复的;
如果hashcode一样,就是在同一个坑里,还需要进行equals比较
如果equals一样,则是重复的数据
如果equals不一样,则是不同数据
创建多线程
1.继承线程类
设计一个类继承Thread,并且重写run方法
启动线程的方法,实例化类的对象,并且调用其start方法
2.实现Runnable接口
创建类并实现Runnable接口
启动的时候,首先创建一个Battle对象,然后根据该battle对象创建一个线程对象,并启动
3.使用匿名类,继承Thread,重写run方法,直接在run方法中写业务代码
.join加入该线程,只有该线程运行完毕,外部线程才会往下运行
StringBuffer和StringBuilder
StringBuffer是线程安全类,StringBuilder是线程不安全类
把非线程安全的集合转换为线程安全 :借助Collections.synchronizedList,可以把Arraylist转换为线程安全的List
wait和notify是同步对象上的方法
wait()的意思是:通知一个等待在这个同步对象上的线程,临时释放当前的占用,并且等待,所以调用wait是有前提条件的,一定是在同步块里,否则就会出错
notify()的意思是,通知一个等待在这个同步对象上的线程,你可以苏醒过来了,有机会重新占用当前对象了
notifyAll()的意思是,通知所有等待在这个同步对象上的线程,你们可以苏醒过来了,有机会重新占用当前对象了
线程池
每一个线程的启动和结束都是比较消耗时间和占用资源的
如果在系统中用到了很多的线程,大量的启动和结束工作会导致系统的性能变卡,相应变慢
为了解决这个问题,引入线程池这种设计思想
线程池的模式很像生产者消费者模式,消费的对象是一个一个的能够运行的任务
线程池设计思想
1.准备一个任务容器
2.一次性启动10个消费者线程
3.刚开始任务容器是空的,所以线程都wait在上面
4.直到一个外部线程往这个任务容器中扔了一个“任务”,就会有一个消费者线程被唤醒notify
5.这个消费者线程去除“任务”,并且执行这个任务,执行完毕后,继续等待下一次任务的到来
6.如果短时间内,有较多的任务加入,那么就会有多个线程被唤醒,去执行这些任务
Lock和synchronized的区别
1.Lock是一个接口,而synchronized是java中的关键字,它是内置的语言实现,Lock是代码层面的实现
2.Lock可以选择性的获取锁,如果一段时间获取不到,可以放弃。synchronized不行,会一根筋一直获取下去,借助Lock的这个特性,就能够规避死锁,synchronized必须通过谨慎和良好的设计,才能减少死锁的发生
3.synchronized在发生异常和同步块结束的时候,会自动释放锁,而Lock必须手动释放,所以如果忘记了释放锁,一样会造成死锁。
事务
没有使用事务时,执行sql语句自动提交,但是会出现错误
使用事务关闭自动提交并且在执行完SQL语句后手动提交
ORM
对象和关系数据库的映射
简单说:一个类对应数据库中的一个表,一个对象对应数据库中的一条记录
DAO
数据访问对象:把数据库相关的操作都封装在一个类里,其他地方看不到JDBC的代码
先声明对数据库增删改查和分页查询的接口,之后再根据表的不同实现该接口
图形界面
事件监听
1.ActionListener 按钮监听
2.KeyListener 键盘监听
3.MouseListener 鼠标监听
4.Adapter 适配器