数据结构
定时器
概念
java.util.TimerTask由 Timer 安排为一次执行或重复执行的任务
实现方式
1、这个类就是一个定时器的类而已
在Timer上需要的操作:设置时间(调用其中的方法)
2、Java中已经提供了一个类,供我们使用java.util.timer
3、Timer类:(定时器对象)具有设计时间,时间到了在执行任务的功能;
4、Timer类常用方法:
void schedule(TimerTask task, long delay) 安排在指定延迟后执行指定的任务
schedule(TimerTask task, Date firstTime, long period) :安排指定的任务在指定的时间开始进行重复的固定延迟执行。
schedule(TimerTask task, long delay) :安排在指定延迟后执行指定的任务。
schedule(TimerTask task, long delay, long period) :安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
同时也重载了scheduleAtFixedRate方法,scheduleAtFixedRate方法与schedule相同,只不过他们的侧重点不同,区别后面分析。
scheduleAtFixedRate(TimerTask task, Date firstTime, long period):安排指定的任务在指定的时间开始进行重复的固定速率执行。
scheduleAtFixedRate(TimerTask task, long delay, long period):安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
数据结构
概念
数据结构定义: 计算机对数据存储的一种安排
数据存储方式
变量存储
数组存储
自定义容器类
实现
定义一个自定义容器类 IntArray
创建一个存放数据的数组 比如 int[] arr = new int[10];
定义一个添加方法 add ,调用一次给当前容器对象添加一个元素;
创建自定义容器类对象,调用add方法,添加元素
自动扩容
当内部数组装满之后,创建一个新的数组arr;
需要把之前的数组拷贝到新数组arr;
使用arr替换之前的数组;
实现存储任意类型
内部使用Object数组来存储Object [] arr
基于链表数据结构
实现
定义容器类,定义一个口袋类(Node),在容器里面有个字段,在容器类里面提供一个add方法;
现在自定义一个类Node(相当于口袋),类里面定义两个字段,一个Object类型存放值,一个Node类型字段,存放下一个Node对象地址.
class Node{
Object data;//用于存储添加的数据...
Node next;//用于保存下一个对象的地址
}
完善链表结构add方法
当每次添加的时候,就把数据封装成一个Node对象
在add方法中,把用户传入的数据打包成Node对象Node node = new Node( obj );
在容器类重定义一个字段Node first 表示链表的顶端
把打包好的数据挂在first上面,注意在挂上去之前,先判断,如果是第一次,直接挂上去放到first上,如果第二次,第三次,挂在最后一个添加Node对象的上面;
First等于null的时候,是第一次;直接把Node的值赋值给first就添加好第一个元素;
添加链表结构
每一次添加一个元素的时候,先封装成一个Node对象,添加之前进行判断,
-
如果添加的是第一个元素(first == null),直接赋值,
-
如果添加的是第二个元素,放到整个链表结构的最后,所以需要找到链表结构中最后一个对象。怎么找到最后一个对象?
-
如果Node对象的next字段为空,那么这个对象就是最后一个,怎样找到next对象为空。
临时定义一个变量Node temp;
第一次,temp=first :temp和first同时都指向第一个对象,操作temp相当于操作第一个对象;
判断 (temp.next == null)如果为 false --》转移目标,让temp指向下一个对象; temp.next 就是指的第二个对象地址;
第二次,temp= temp.next :temp指向第二个对象,再一次操作temp,相当于操作第二个对象,
判断 temp.next == null false —》转移目标
直到temp.next == null ,true temp指向对象的next为空,temp.next = node;
public class LinkedList {
Node n;
public void add(Object obj){
Node node = new Node(obj);
if (n==null) {//如果n为空
n=node;//把第一个node赋给n
}else{//如果n不为空
Node temp=n;//创建一个中间站temp
while (temp.next!=null) {//传入第三个node,temp.next不为空
temp=temp.next;//把temp.next赋给temp,temp和n断开,与第二个node连接,第二个temp.next就为null,
}
temp.next=node;//当temp.next为null时,把第二个node赋给temp.next
}
}
@Override
public String toString() {
Node temp=n;
StringBuffer str = new StringBuffer("[");
while (temp!=null) {
if (temp.next!=null) {
str.append(temp.data).append(",");
} else {
str.append(temp.data).append("]");
}
temp=temp.next;
}
return str.toString();
}
}
//节点类
class Node{
Object data;//传入数据
Node next;//接受下一个节点的地址值
Node (Object obj){
data=obj;
}
Node(){}
}