目录
定时器-数据结构
1.内容介绍
定时器【掌握】
什么数据结构(了解)
自定义数据结构(基于数组)(了解)
添加操作数据的方法(了解)
自定义数据结构-(链表结构)(了解)
2.定时器
2.1.定时器执行任务的认识
定时炸弹
定时炸弹:一个炸弹+一个定时器组成的
原理:当定时器到指定的时间了就引爆炸弹(到了指定的时间执行指定的任务)
闹钟
到了指定的时间就(响铃+震动)
重复每天固定的时间都要响
定时邮件发送
2.2.什么是定时器?
定时任务java.util.TimerTask由 定时器java.util.Timer安排为一次执行或重复执行的任务。
2.3.Java中是的实现方式java.util.Timer
1、编写一个定时任务
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("爆炸....le");
}
}
2、测试定时器执行定时任务
Timer timer = new Timer();//创建一个定时器
MyTimerTask myTimerTask = new MyTimerTask();//创建一个任务
timer.schedule(myTimerTask, 5000);//安排任务在5秒钟之后执行
2.4.小结
3.什么是数据结构
3.1.什么是数据结构
在大学期间,专门有门课程叫数据结构,那数据结构有什么用呢?
简单理解数据结构是用来存储数据的;(比如堆栈,队列,二叉树)
数据结构定义: 计算机对数据存储的一种安排;数据结构是对数据进行组织和管理;
3.2.常见数据结构
数据结构:计算机对数据存储的一种方式
常见数据结构 :数组(Array)、栈( Stack)、队列(Queue)、链表( Linked List)、树( Tree)…
3.3.数据存储方式回顾
思考:回顾存储数据的知识,目前有哪些可以用来存储数据?
1.变量存储
2.数组存储
问题:如上两种存储方式,存储能力有限,如果希望存储任意类型,任意个数怎么办?
3.4.小结
4.自定义数据结构(基于数组)
4.1.自定数据结构存储数据分析
自定义容器类目标希望可以存储,任意多个元素;任意类型的数据;
分析:在Java中,万物皆对象,可以设置一个类表示上面的容器,那怎么设计?
提示:
Integer类 里面有个int value 变量存储值,
String类 里面有个 char[] value 字符数组变量存储值.
步骤:
自定义一个容器类,比如(IntArray类);
先做到可以存储多个int值,内部字段使用int数组;
类里面 创建了一个int数组
当int数组填满之后,创建一个新的数组;并且把老的数组值拷贝到新的数组里面(实现自动扩容);
自定义类已经设计好了,那用户在操作的时候,怎么使用?也就是怎么存值,怎么取值?
提供了一个add方法,调用一次add方法就向容器里面添加一个元素;
4.2.自定义容器存储固定类型多个数据
上面已经说明可以自定义一个容器类来存储值,具体怎么实现?
实现步骤:
1.定义一个自定义容器类 IntArray
2.创建一个存放数据的数组 比如 int[] data = new int[10];
3.定义一个添加方法 add ,调用一次给当前容器对象添加一个元素
4.创建自定义容器类对象,调用add方法,添加元素
代码实现:【添加size 表示存储数据个数,覆写toString打印容器对象中的数据】
public class IntArray {
private int [] data= new int[10];
int size = 0 ;
public void add(int str){
data[size++] = str;
}
//覆写toString方法
@Override
public String toString() {
int [] newArr = new int[size];
System.arraycopy(data, 0, newArr, 0, size);
return Arrays.toString(newArr);
}
//添加返回数组大小方法:getSize
public int getSize(){
return size;
}
}
4.3.自定义容器–自动容量
4.3.1.构造方法指定容器长度
上面的示例中,当需要添加大于10个数据,就会出现数组越界,比如用户想添加11个值,就会出错,那能否根据用户的需要,添加指定大小的容器;
分析:通过提供的构造方法完成,但是只能在初始化容器的时候设置大小
如下关键代码:
private int[] data;
int size = 0;
public IntArray(){
this(10);
}
public IntArray(int length){
data = new int[length];
}
4.3.2.自动扩容支持任意多个数据
1.当内部数组装满之后,创建一个新的数组arr;
2.需要把之前的数组拷贝到新数组arr;
3.使用arr替换之前的数组;
代码怎么写?:每添加一次,都应该判断是否有空间. 应该写在add方法里面;
public void add(int i){
if(size == data.length){//扩容[ +10 ]新数组 将久数组值,复制到新数组
int[] newArr = new int[size+20];
System.arraycopy(data, 0, newArr, 0, size);
data = newArr;
}
data[size] = i;
size++;
}
4.3.3.支持任意类型
支持任意类型的容器,比如支持字符串,整型,boolean型等
内部使用Object数组来存储 Object [] date;
4.4.小结
5.添加操作数据的方法
5.1.自定义容器–查找方法
1.查找指定索引处的元素;
2.查找指定元素第一次出现的索引
5.2.自定义容器–删除方法
1.删除指定索引处的元素
2.删除指定的第一个元素
5.3.小结
6.自定义数据结构-(链表结构)
6.1.什么是链表结构及实现分析
1.链表结构示意图
2.对于变量直接赋值使用; 对于数组,通过下标使用; 对于自定义容器类的操作,我们通过添加add方法,进行使用.它的原理是内部使用数组来存储实现,但是用户并不关心内部怎么实现.
3.目前已经使用变量,数组,还有自定义容器类存放数据;
1)变量:存储一个值;
2)数组:存储多个值;
3)自定义容器类: 在类中封装一个数组;
4.需求:----->设计一个容器类,采用链表结构:内部实现替换数组用变量
问题: 怎样把 多个变量链接起来,还能够存储任意数据类型?
分析:
①从存储任意数据类型来看,目前所有类中只有Object可以满足
②但是Object只能存一个对象的地址,无法满足链接下一个对象
结论:目前已知类型不能满足:怎么办?
①现在自定义一个新的类型Node,类里面定义两个字段,
② 一个Object类型字段存放值
③一个Node类型字段,存放下一个Node对象地址.
class Node{
Object data;//用于存储添加的数据...
Node next;//用于保存下一个对象的地址
}
5.示意图:
这种一个Node对象字段next存放下一个Node对象的地址,依此连接下去 -----> 形成链表;
6.2.链表实现分析及代码清单
怎么写代码实现上面的步骤
定义容器类,定义一个口袋类(Node),在容器里面有个字段,在容器类里面提供一个add方法;
完善链表结构add方法?
1.当每次添加的时候,就把数据封装成一个Node对象 ,在add方法中,把用户传入的数据打包成Node对象Node node = new Node( obj );
2.在容器类重定义一个字段Node first 表示链表的顶端
3.把打包好的数据挂在first上面,注意在挂上去之前,先判断,如果是第一次,直接挂上去放到first上
怎么确定是第一次添加?First等于null的时候,是第一次;直接把Node的值赋值给first 就添加好第一个元素;
4.如果第二次,第三次,挂在最后一个添加Node对象的上面; 如何挂到最后一个节点,请看代码示例
public class LinkedList {
Node first;//2.链表顶端
int size;
public void add(Object obj){
Node node = new Node(obj);/1./每次添加数据封装成一个Node对象
if(first == null){//3.如果是第一次添加数据,应该将第一个节点放到链表顶端first
first = node;
}else{//4.二次,三次 及之后新的数据添加到链表尾部,挂在最后一个Node对象后面
Node temp = first;
//temp.next == null;表示最后一个节点
//temp.next != null;表示还有下一个节点,所以需要遍历
while(temp.next != null){
temp = temp.next;//把下一个节点地址值给到temp,temp最终指向最后一个节点
}
temp.next = node;//最新的节点挂到链表末尾
}
size++;
}
}
上面while循环完之后,零时变量temp始终指向的对象next字段为空的对象.
6.3.链表覆写toString方法
为什么要覆写toString
现在对于自定义容器里面,添加了一个add方法,调用一次添加一次,现在我想验证是否已经添加进去容器里面,怎么验证?
代码清单
@Override
public String toString() {
Node temp = first;//遍历链表取出每个节点中data字段保存的值
StringBuilder sb = new StringBuilder("[");
while(temp != null){
if(temp.next!=null){//中间的追加,
sb.append(temp.data).append(",");
}else{
sb.append(temp.data).append("]");
}
temp = temp.next;
}
return sb.toString();
}
6.4.链表结构-代码优化
链表结构里面的功能有添加,获取大小,还有覆写toString方法,但是对于原理就比较复杂了,把用户需要添加的数据封装成了Node对象,Node对象挂在first上面,如果添加第二次,把第二个Node对象挂在第一个的next下面,用的一个Node类封装数据;现在把Node类放到链表类里面,定义成私有,这样就不是分开的两个类。只在本类进行使用;
6.5.小结
7.课程总结
7.1.重点
7.2.难点
链表结构:拿着纸和笔绘图…一步一步理清思路,千万不要只动脑袋想
8.常见面试题
9.课后练习[30分钟]
1、定时器查询API学习比较以下两个方法的区别:
schedule(TimerTask task, Date firstTime, long period)
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
10.每日一练[20分钟]
请问0x3e,0B1010101等于多少
请写出所有创建数组的方式(动态创建/静态创建)