5.Java加强-定时器Timer、数据结构、集合

本文详细介绍了Java中的线程概念、多线程实现、Timer类及其定时任务的使用,探讨了数据结构如数组、链表、队列、栈和集合的存储方式及应用场景,重点讲解了ArrayList、LinkedList、HashSet和TreeSet等常见数据结构的特性和方法。
摘要由CSDN通过智能技术生成
  • 定时器(线程):定时任务(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():创建一个空的树型结构,采用自然排序
  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值