习题:
定义一个泛型类DAO<T>,在其中定义一个Map成员变量,Map的键为String类型,值为T类型
分别创建以下方法:
1、public void save(String id,T entity):保存T类型的对象到Map成员变量中
2、public T get(String id):从map中获取id对应的对象
3、public void update(String id,T entity):替换map中key为id的内容,改为entity对象
4、public List<T> list():返回map中存放的所有T对象
5、public void delete(String id):删除指定id对象
定义一个User类:
该类包含:private成员变量(int类型) id,age;(String 类型) name。
创建DAO类的对象,分别调用其save、get、update、list、delete方法来操作User对象,
//定义User类
public class User{
private int id;
private int age;
private String name;
//构造器,get,set,重写toString
}
public class DAO<T>{
private Map<String,T> map = HashMap<>();
public T get(String id){
return map.get(id);
}
public void update(String id,T entity){
map.put(id,entity);
}
//遍历map,将map的所有value(entity),封装到ArrayList返回即可
public List<T> list(){
//创建ArrayList
List<T> List = new ArrayList<>();
//遍历map
Set<String> keySet = map.keySet();
for (String key : keySet) {
list.add(get(key));
}
}
public void delete(String id){
map.remove(id);
}
public void save(String id,T entity){
map.put(id,entity);
}
}
java事件处理机制:
java事件处理是采取”委派事件模型”。当事件发生时,产生时间的对象,会把此”信息”传递给”事件的监听者”处理,这里说的”信息”实际上就是java.awt.event事件类库里某个类所创建的对象,把它称为”事件的对象”。
事件源:
事件源是一个产生事件的对象,比如按钮,窗口等
事件:
事件就是承载事件源状态改变时的对象,比如当键盘事件、鼠标事件、窗口事件等等,会生成一个事件对象,该对象保存着当前时间很多信息,比如KeyEvent对象有含有被按下键的Code值。
java.awt.event包和javax.swing.event包中定义了各种事件类型
事件类型:
ActionEvent:通常在按下按钮,或双击一个列表项或选中某个菜单时发生
AdjustmentEvent:当操作一个滚动条时发生
ComponentEvent:当一个组件隐藏、移动、改变大小时发送
ContainerEvent:当一个组件从容器中加入或者删除时发生
FoucusEvent:当一个组件获得或是失去焦点时发生
ItemEvent:当一个复选框阔是列表被选中时,当一个选择框或选择菜单被选中
KeyEvent:当从键盘的按键被按下,松开时发生
MouseEvent:当鼠标被拖动,移动,点击,按下…
TextEvent:当文本框和文本域的文本发生改变时发生
WindowEvent:当一个窗口激活,关闭,失效,恢复,最小化
事件监听器接口:
- 当事件源产生一个事件,可以传送给事件监听者处理
- 事件监听者实际上就是一个类,该类实现了某个事件监听接口,比如MyPlane是一个类,实现了KeyListener接口,它就可以作为一个事件监听者,对接受到的事件进行处理
- 事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现多个监听接口
- 这些接口在java.awt.event包和javax.swing.event包中定义。
程序进程线程:
- 单线程:同一个时刻,只允许执行一个进程
-
多线程:同一个时刻,可以执行多个线程,比如:一个qq进程,可以同时打开多个聊天窗口,一个迅雷进程,可以同时下载多个文件
-
并发:同一个时刻,多个任务交替执行,造成一种”貌似同时”的错觉,简单的说,单核CPU实现的多任务就是并发
-
并行:同一个时刻,多个任务同时执行。多核cpu可以实现并行
程序:
- 为完成特定任务,用某种语言编写的一组指令的集合
进程:
- 进程是指运行中的程序,比如使用qq,就是启动了一个进程,操作系统就会为该进程分配内存空间。比如使用迅雷,又启动了一个进程,操作系统将为迅雷分配刷新的内存空间
- 进程是程序的一次执行过程,或是正在运行的一个程序。是动态的过程:有它自身的产生、存在和消亡的过程
线程:
- 线程由进程创建的,是进程的一个实体
- 一个进程可以有多个线程
线程基本使用:
在java中线程来使用有两种方法
- 继承Thread类,重写run方法
- 实现Runnable接口,重写run方法
案例1:
1、编写程序,开启一个线程,该线程每隔1秒。在控制台输出"喵喵,我是小猫咪"
2、对上题改进:当输出80次 喵喵,我是小猫咪 ,结束该进程
3、使用JConsole监控线程执行情况,并画出程序示意图
//1、当一个类继承了Thread类,该类就可以当作线程使用
//2、我们会重写run方法,写上自己的业务代码
//3、run Thread类 实现了Runnable 接口的run方法
/*
@Override
public void run(){
if(target != null){
target.run();
}
}
*/
class Cat extends Thread{
int times = 0;
@Override
public void run(){ //重写run方法,写上自己的业务逻辑
whlie(true){
System.out.print("喵喵,我是小猫咪" + (++times));
//使用try-catch包住
Thread.sleep(1000);
//使用try-catch包住
if (times == 80) {
break;//当times 到80,退出while,这时线程也就退出
}
}
}
}
public static void main(String[] args) {
//创造Cat对象,可以当作线程使用
Cat cat = new Cat();
cat.start(); //启动线程
}
Runnable创建线程:
- java是单继承的,在某些情况下一个类可能已经继承了某个父类,这时再用继承Thread类方法来创建线程显然是不可能了
- java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建线程
例子:
编写程序,可以每隔1秒,在控制台输出"hi!",当输出10次后,自动退出。
使用实现Runnable接口的方式实现,这里是静态代理
-----------------------------------------------
class Dog extends Runnable{ //通过实现Runnable接口,实现开发线程
int count = 0;
@Override
public void run(){ //重写run方法,写上自己的业务逻辑
whlie(true){
System.out.print("小狗汪汪叫~hi" + (++count) + Thread.currentThread().getName());
//使用try-catch包住
Thread.sleep(1000);
//使用try-catch包住
if (count == 10) {
break;//当count 到10,退出while,这时线程也就退出
}
}
}
}
public static void main(String[] args) {
Dog dog = new Dog();
//dog.start(); 这里不能调用start
//创建了Thread对象,把dog对象(实现Runnable),放入Thread
Thread thread = new Thread(dog);
thread.start();
}