A017_定时器_数据结构

本文介绍了Java中的定时器使用,通过java.util.Timer实现定时任务,并讲解了数据结构的基础概念,包括数组和自定义数据结构的实现。详细阐述了基于数组的自定义容器类的设计,支持自动扩容和任意类型数据存储。此外,还探讨了链表结构的实现,包括Node类的定义和链表的添加、toString方法的覆写。文章最后提供了课后练习,帮助巩固所学知识。
摘要由CSDN通过智能技术生成


定时器-数据结构

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等于多少
请写出所有创建数组的方式(动态创建/静态创建)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值