08.JDK8版本之后的时间API
1.日历类(国内时间)
-
LocalDate、LocalTime、LocalDateTime
LocalDateTime : 年月日时分秒
LocalDate : 年月日
LocalTime : 时分秒
1.now() : 当前时间 2.of(...) : 设置时间
-
LocalDateTime 转换LocalDate, LocalTime
1. toLocalDate() 2. toLocalTime()
2.格式化日期类
-
DateTimeFormatter
public static void main(String[] args) { //获取当前时间 LocalDateTime now = LocalDateTime.now(); //获取格式化对象 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年M月d日"); //格式化当前时间 String date = formatter.format(now); System.out.println(date); //解析输入的日期字符串 String birthday = "2001年5月14日"; LocalDate localDate = LocalDate.parse(birthday, formatter); System.out.println(localDate); }
3.时间戳类(国外时间)
-
Instant : 时间戳
Instant instant = Instant.now(); System.out.println("当前时间戳是:" + instant);
-
ZonedDateTime atZone(ZoneId zone) : 获取指定的时区
-
public static void main(String[] args) { Instant now = Instant.now(); System.out.println(now); ZonedDateTime zonedDateTime = now.atZone(ZoneId.systemDefault()); System.out.println(zonedDateTime); ZonedDateTime zonedDateTime1 = now.atZone(ZoneId.of("Europe/Paris")); System.out.println(zonedDateTime1); }
4.和时间有关的计算(具体代码实现可以面向API)
- Period ( 计算日期间隔,用于 LocalDate 之间的比较 )
- Duration (计算日期间隔,用于 LocalDateTime,Instant 之间的比较 )
- ChronoUnit(计算日期间隔 , 可以比较所有的时间单位 )
09.集合
1.集合体系结构
- 集合有两大子类 : Collection(单列) , Map(双列)
- Collection接口存储一组不唯一(允许重复),无序的对象 , 其子类是Set和List
- Set接口继承Collection接口,存储一组唯一(不允许重复),无序的对象
- List接口继承Collection接口,存储一组不唯一(允许重复),有序(以元素插入次序来放置元素,不会重新排列)的对象
- Collection接口存储一组不唯一(允许重复),无序的对象 , 其子类是Set和List
- Map接口存储一组成对的键-值对象,提供key(键)到values(值)的映射,Map中的Key不要求有序,不允许重复。values同样不要求有序,但是允许重复
2.集合和数组的区别
集合 | 数组 | |
---|---|---|
长度 | 长度可变 | 长度固定 |
储存 | 只能储存引用数据类型 | 可以储存基本数据类型和引用数据类型 |
使用场景 | 长度经常发生改变的数据 | 长度固定不变的数据 |
3.Conllection集合
-
对象创建方式
Collection 是接口 不能创建对象, 所以选择多态, 父类引用指向子类对象 目前这样创建, 是为了, 了解 Collection 中共有的方法. */
2.常用方法
方法名 说明 public boolean add(E e) 把指定对象添加到集合中 public void clear() 清除集合中的对象 public boolean remove(E e) 把指定的对象删除 public boolean contains(Object obj 判断集合中是否有相同的元素 public boolean isEmpty() 判断集合里是否存在元素 public int size() 获取集合长度
4.集合的遍历方式
-
System.out.println("迭代器遍历"); Iterator<Student> it = list.iterator(); while (it.hasNext()){ Student s = it.next(); System.out.println(s); } System.out.println("-----增强for循环遍历-----"); for (Student stu : list) { System.out.println(stu); } System.out.println("-----for each遍历(匿名内部类)-----"); list.forEach(new Consumer<Student>() { @Override public void accept(Student stu) { System.out.println(stu); } }); System.out.println("-----for each遍历(lambda表达式)-----"); list.forEach(stu -> System.out.println(stu));
2.增强for循环是迭代器遍历的语法糖 , 增强for循环和for each遍历的原理都是迭代器遍历
5.迭代器遍历的流程
6.内存图
7.ArrayList
-
底层数组实现, 增删慢, 查询修改比较快
场景 : 适用于查询和修改比较多的场景
-
并发修改异常 : 当迭代器在遍历的过程中 , 使用集合的添加或删除方法, 则出现并发修改异常
(迭代器对象, 集合对象) 同时操作, 就是并发修改
结论 : 迭代器遍历的过程中, 如果涉及到赠删, 请使用迭代器自身的赠删方法
-
遍历方式 : 增强for循环,for each遍历,迭代器遍历,普通for循环(因为list集合有索引)
-
ArrayList扩容原理图:
8.LinkList
-
底层链表实现, 查询修改比较慢, 增 删相对快一点
首尾操作极快 !
-
遍历方法 : 增强for循环,for each遍历,迭代器遍历,普通for循环