- 定时器(线程):定时任务(Timer , TimerTask:定时任务 )
- 数据结构:数据的一种存储方式(1.可变数组 2.链表 3.队列(先进先出) 4.栈(先进后出) 5.树形)
- 集合
一、回顾
1、线程概念
2、线程的执行流程,设计多线程的意义
4、实现多线程的方式
5、创建线程的对象
6、线程安全
7、处理线程安全的问题(三种)
8、线程的生命周期
二、定时器(Timer)
- Timer起始就是一个线程,用于执行某个特定的任务
1、Timer类构造方法
- Timer():创建一个 默认名字,不是守护线程的定时器对象
- Timer(boolean isDaemon):创建定时器对象时将线程设置为守护线程
- Timer(String name):指定线程的名字
- Timer(String name,boolean isDaemon):指定线程名,设置为守护进程
2、Timer常用方法
1、一次性任务schedule(TimerTask task,Date time)
- schedule(TimerTask task,Date time)
- task: 就是定时任务
- time:设定的时间
- 到time时间执行一次task任务,就结束(一次定时任务)
- schedule(TimerTask task,loog delay)
- delay:延迟,当前时间后的毫秒
- 当前时间delay毫秒执行task一次(一次性任务)
2、周期性任务
- schedule(TimerTask task,Date firstTIme time,long period)
- 到firstTIme开始执行task ,之后每隔period时间就执行一次(周期性的)
- schedule(TimerTask task,long delay ,long period)
- 到当前时间延迟delay毫秒后执行一次task仍无,之后每隔period执行一次(周期性)
注:以上时间不支持过去的时间,如果遇到断电,代码异常等定时任务执行次数会减少
3、支持过去的时间
- scheduleAtFixedRate(TimerTask task,Date firstTIme,long period)
- scheduleAtFixedRate(TimerTask task,long delay,long period)
- 支持过去的时间,会将由于断电,异常影响未做的一次性补做
3、定时任务TimerTask
- 抽象类:具有强制功能,要求必须重写run()
- 需要自己声明子类来实现、使用匿名内部类来完成
4、使用场景
- 定时备份
- 定时日志,报告
- 定时发邮件
- 定时下载上传
三、数据结构
- 数据结构:数据结构就是一种存储方式
- 学习数据结构的目的:选择合适的数据结构可以提高程序的性能
1、常见的数据结构
- 基于数组的结构(可变数组)
-
- 数组的缺点长度固定,如果超过就需要手动扩容,操作很频繁
- 设计一个类将数组封装在其中使代码自动扩容
- 优点:是查循修改元素效率高(因为是数 组,有下标,可以通过下标直接定位)
- 缺点:尾部添加元素,插入数据,删除数据的性能差
- 查改效率高,增删效率低
- 基于链表的结构
-
- 增删插快,查改慢
class Node{
private Object value;//Node类属性
privte Node next;//保存下一个对象的地址
}
class LinkedList{ //模拟一个链表
Node header; //链表的头部
Node footer; //链表的尾部
}
Node n1 = new Node("a");
header = n1;
footer = n2;
- 树形结构(二叉树)
-
- 为了将链表的结构的查询效率提高
- 根节点 :根节点下面有两个子节点
- 栈结构:进出口是一个,存放数据是从最底部开始往上放
- 取出数据是从上往下
- 特点:先进后出
- 队列(双向队列)
-
- 一个口既是出口也是入口
- 方便对头尾进行操作数据
四、集合
- 集合:就是在某一个数据结构的基础上设计的一个类;用来保存数据的容器(就是一个对象)
1、集合的体系结构
- List一般用来添加数据,Set一般用来去重
- Collection:集合的根接口
- List:Collection的子接口,元素可以重复而且是有序的;
-
- 有序:存入和取出元素的顺序是一致的;
- 元素重复原因:放入的数据没有进行判断,存储的效率快
- 常用实现类:
-
-
- ArrayList:基于数组的一个集合,线程不安全
- LinkedList:基于链表、栈、双向队列
- Vector:基于数组的集合,线程安全
-
- Set:Collection的子接口,元素不可以重复,而且是无序的
-
- 常用实现类:
- HashSet:底层是使用一个哈希表(数组,链表)
- LinkedHashSet:底层是一个哈希表+链表
- TreeSet:底层是一个树形结构
2.ArrayList集合
1. 基于数组的集合
- 构造方法:Java中的特殊方法,没有返回值,方法名和类名一致,只能通过new创建对象
-
- ArrayList():底层会创建一个长度为10的数组,数据的类型是Object
- ArrayList(Collection<? extends E> c):将其他Collection体系中其他集合转为Array List
- ArrayList(int initialCapacity):指定层数数组长度来创建集合
- 常用方法:
-
- add(E e):在集合的尾部添加元素
- add(int index,E element):在指定下标位置添加元素(插入元素)
- addAll(Collection<? extends E>c):将传入的集合中的每一个元素追加到集合的尾部
- addAll(int index ,Collection<? extends E>c):在指定位置传入集合的所有元素(插入)
- remove(int index):删除传入下标上的元素
- remove(Object o):删除传入元素
- removeAll(Collection <?>c):将传入集合中所有元素,从集合中删除
- retainAll(Collection<?>c):将传入集合中所有元素保留,其余全部删除
- set(int index , E element):修改元素
- subList(int fromIndex,int toIndex):截取集合元素
- get(int index):通过传入的下标获取指定的元素
- indexof(Object o):查找传入元素在集合第一次出现的位置
- lastIndexof(Object o):查找传入元素最后一次出现的位置
- contains(Object o):判断一个元素在集合是否存在
- isEmpty():判断集合是否为空
- iterator():获取遍历集合的单项迭代器(foreach的底层)
- ListIterator():获取遍历集合的双向迭代器
- size( ):获取元素中的个数
- trimToSize():释放空余的长度
- clear():将集合清空
2. 迭代器需要掌握的方法
-
- hasNext():判断集合中有没有元素
- Next():取出一个元素,指针下移动一位
3. ArryList的扩容
- 底层是一个数组
- 扩容时机:添加元素的个数 List.size( ) > 数组长度
- 扩容机制:原数组长度的1.5倍:length = length+length >>1;
- 使用场景:以 查改为主
3.LinkedList
- 底层是一个双向链表
-
- 单项迭代器:iterator
- 双向迭代器:listiterator
- 常用方法:
-
- addFirst(E e):在头部添加元素
- addLast(E e):在尾部添加元素
- element():取出链表头部元素【不删除】
- getFirst():获取头部元素【不删除】
- getLast():获取尾部元素【不删除】
- offer(E e):在尾部添加元素等同于add()
- offerFirst(E e):在头部插入元素
- offerLast(E e):在尾部插入元素
- peek():取出头部元素【不删除】
- peekFirst():取出第一个元素【不删除】
- peekLast():取出最后一个元素【不删除】
- poll():取出头部元素【删除】
- pollFirst:取出第一个元素【删除】
- pollLast:取出最后一个元素【删除】
- removeFirst():删除第一个元素
- removeLast():删除最后一个元素
1、构造方法
- LinkedList():构造一个空列表
- LinkedList():构造一个包含指定集合元素的列表,按照迭代器返回的顺序
2、vector
- 底层:数组
- 特点:查改快,增删查慢
- 线程是安全的
4.栈结构
- 栈结构:先进后出
- 栈常用方法:
-
- push(E e):压栈,将元素放入栈里面
- pop():出栈(将栈头部元素取出并删除)
- p eek():取出栈头部元素(不删除)
5.set集合
- 无序不可重复的
- 常用实现类:
-
- HashSet:底层是使用一个哈希表(数组,链表)
- LinkedHashSet:底层是一个哈希表+链表
- TreeSet:底层是一个树形结构
- HashSet底层是一个哈希表(散列表):数组,数组中的每一个元素是一个链表,HashSet是通过HashMap来实现的
- 去重机制:
-
- 添加元素的流程:
-
-
- 1.将添加元素的hashCode获取到【a.hashCode()】
- 2.在集合中去查看有没有这个哈希值
-
-
-
-
- 没有【要添加的元素在集合不存在】
-
-
-
-
-
-
- 计算存放的下标【hashCode % 数组的长度】
- 在计算出的位置添加元素
-
-
-
-
-
-
- 有【这个哈希值在集合中已经存在】
-
-
-
-
-
-
- 比较他们的equals【"a".equals(e:哈希值相等的元素)】
- 不相等:说明添加元素也不存在,计算位置,添加元素
- 相等:说明元素存在,不再添加
-
-
-
- 无序形成的原因:存放元素下标需要计算,底层数组的长度又是可以变化,计算出的位置是变化的
1. 常用构造方法
- Hashset():构造一个新的空集合默认初始容量16,集合的长度达到75%的时候会自动扩容
- HashSet(Collection<? extends E> c):构造一个包含指定
2. 常用方法:除了操作下标的方法,其他的方法和List方法一样
3. 使用场景:去重
4. LinkedHashSet(哈希表+链表)
- 有序的HashSet
5. TreeSet(哈希表+链表)
不重复
- 接口:
-
- Comparable:自然比较器
-
-
- 方法:
-
-
-
-
- int compareTo(T o)
-
-
-
-
-
-
- 0:相等
- 正负数:
-
-
-
-
-
-
-
-
- 正数:this 比 o 大
- 负数:this 比 o 小
-
-
-
-
-
- Comparator:定制比较器
-
-
- 方法:
-
-
-
-
- int Compare(T o1 , T o2);
-
-
-
-
-
-
- 比较:o1 和 o2
- 0:相等
- 正负数:
-
-
-
-
-
-
-
-
- 正数:o1 比 o2 大
- 负数:o1 比 o2 小
-
-
-
-
-
- 接口作用:用于对象间比较大小,用于排序的
- 定制的比较器,和自然比较器时,定制比较器优先级大于自然比较器
- TreeSet
-
- 底层是通过树形结构来完成的(其实通过TreeMap(树形))
- 注:TreeSet会以第一个加入集合元素类型为准,后面要加入的元素类型必须以第一个元素类型一致
- 去重原理:
-
-
- 通过自然比较器或定制比较器返回 0 来去重
-
-
- 学习TreeSet
-
-
- TreeSet():创建一个空的树型结构,采用自然排序
-