五、常用API、Lambda、常见算法
需要学会什么:
- 如何处理时间:在程序中经常需要处理时间、获取时间、时间判断、运算等。
- 认识包装类:Java认为一切皆对象,8种基本类型不是,如何实现的,集合、泛型也不支持基本类型,怎么解决?
- 正则表达式:程序中需要对各种信息进行格式合法性的校验,如手机号码,邮箱等。
- 经常需要操作数组元素:如何快捷操作数组元素,如输出数组内容、排序、元素搜索等。排序和搜索算法是什么样的?
- Lambda表达式:匿名内部类的代码是可以进一步的简化的,什么情况下可以简化,需要用什么知识完成?
1.日期与时间
a.Date
Date类概述:
- Date类的对象在Java中代表的是当前所在系统的此刻日期时间。
Date的构造器:
名称
说明
public Date()
创建一个Date对象,代表的是系统当前此刻日期时间。
public Date(long time)
把时间毫秒值转化成Date日期对象。
Date的常用方法:
名称
说明
public long getTime()
获取时间对象的毫秒值。
public void setTime(long time)
设置日期对象的时间为当前时间毫秒值对应的时间。
Date类记录时间的2种形式:
-
形式一:日期对象。
Date date = new Date(); System.out.println(date);
-
形式二:时间毫秒值。
Date date = new Date(); long time = date.getTime(); System.out.println(time); long time1 = System.currentTimeMillis(); System.out.println(time1);
案例:请计算当前时间往后走1小时121秒之后的时间是多少。
Test.java
import java.util.Date;
public class Test {
public static void main(String[] args) {
// 获取当前系统时间戳
long current_date = System.currentTimeMillis();
current_date += (60 * 60 + 121) * 1000;
// 方式一:时间戳转化为日期类型
Date date = new Date(current_date);
System.out.println(date);
// 方式二:将Date对象设置为表示 1970 年 1 月 1 日 00:00:00 GMT 之后的时间毫秒的时间点
Date date1 = new Date();
date1.setTime(current_date);
System.out.println(date1);
}
}
总结:
-
日期对象如何创建,如何获取时间毫秒值?
- Date date = new Date();
- Long time = date.getTime();
-
时间毫秒值怎么恢复成日期对象?
Date date = new Date(time); date.setTime(time);
b.SimpleDateFormat
SimpleDateFormat类的作用:
-
可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式。
-
也可以把字符串的时间形式解析成日期对象。
// 格式化
// Date对象 ——》 2022年6月16日 17:00
// 时间毫秒值 ——》 2022年6月16日 17:00// 解析
// 2022年6月16日 17:00 ——》 Date对象
SimpleDateFormat的构造器:
构造器
说明
public SimpleDateFormat()
构造一个SimpleDateFormat,使用默认格式。
public SimpleDateFormats(String pattern)
构造一个SimpleDateFormat,使用指定的格式
SimpleDateFormat的格式化方法:
格式化方法
说明
public final String format(Date date)
将日期格式化成日期/时间字符串。
public final String format(Object time)
将时间毫秒值式化成日期/时间字符串。
格式化的时间形式的常用的模块对应关系如下:
2022-06-16 18:00:00 -> yyyy-MM-dd HH:mm:ss
2022年06月16日 18:00:00 -> yyyy年MM月dd日 HH:mm:ss
- y:年
- M:月
- d:日
- H:时
- m:分
- s:秒
Test.java
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) {
// 日期对象
Date date = new Date();
System.out.println(date);
// 创建格式化日期对象
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
// 格式化日期对象
String rs = simpleDateFormat.format(date);
System.out.println(rs);
// 格式化时间毫秒值
// 求121之后的时间
long time = System.currentTimeMillis() + 121 * 1000;
String rs1 = simpleDateFormat.format(time);
System.out.println(rs1);
}
}
SimpleDateFormat解析字符串时间成为日期对象:
解析方法
说明
public Date parse(String source)
从给定字符串的开始解析文本以生成日期。
案例:请计算出2022年06月16日19点10分10秒,往后走3天20小时50分30秒后的时间是多少。
Test.java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test1 {
public static void main(String[] args) throws ParseException {
// 解析字符串时间
// 案例:请计算出2022年06月16日19点10分10秒,往后走3天20小时50分30秒后的时间是多少
String dateStr = "2022年06月16日 19:10:10";
// 字符串时间解析成日期对象
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = simpleDateFormat.parse(dateStr);
// 往后走3天20小时50分30秒
long time = date.getTime() + (3L * 24 * 60 * 60 + 20 * 60 * 60 + 50 * 60 + 30) * 1000;
// 2022年06月20日 16:00:40
System.out.println(simpleDateFormat.format(time));
}
}
总结:
-
SimpleDateFormat可以格式化哪些时间形式?
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String rs1 = simpleDateFormat.format(date); String rs2 = simpleDateFormat.format(time);
-
SimpleDateFormat如何进行字符串时间的解析?
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = simpleDateFormat.parse("2022-06-16 19:10:10")
案例:秒杀活动
需求:秒杀活动2022年6月18日 00:00:00 - 2022年6月18日 00:01:00
- 小甲下单并付款的时间为:2022年6月18日 00:00:01
- 小乙下单并付款的时间为:2022年6月18日 00:01:20
- 用代码说明这两位同学有没有参加秒杀活动成功。
分析:
- 判断下单时间是否在开始到结束的范围内。
- 把字符串形式的时间变成毫秒值。
Test.java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) throws ParseException {
// 需求:秒杀活动2022年6月18日 00:00:00 - 2022年6月18日 00:01:00
//
//- 小甲下单并付款的时间为:2022年6月18日 00:00:01
//- 小乙下单并付款的时间为:2022年6月18日 00:01:20
//- 用代码说明这两位同学有没有参加秒杀活动成功。
// 创建SimpleDateFormat对象
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// 活动开始时间
String startTime = "2022年6月18日 00:00:00";
// 活动结束时间
String endTime = "2022年6月18日 00:01:00";
// 小甲参加活动时间
String JiaJoinTime = "2022年6月18日 00:00:01";
// 小乙参加活动时间
String YiJoinTime = "2022年6月18日 00:01:20";
// 转成Date对象
Date startTimestamp = simpleDateFormat.parse(startTime);
Date endTimeTimestamp = simpleDateFormat.parse(endTime);
Date JiaJoinTimestamp = simpleDateFormat.parse(JiaJoinTime);
Date YiJoinTimestamp = simpleDateFormat.parse(YiJoinTime);
if (whetherSucceed(startTimestamp, endTimeTimestamp, JiaJoinTimestamp)) {
System.out.println("小甲参加活动成功!");
} else {
System.out.println("小甲参加活动失败!");
}
if (whetherSucceed(startTimestamp, endTimeTimestamp, YiJoinTimestamp)) {
System.out.println("小乙参加活动成功!");
} else {
System.out.println("小乙参加活动失败!");
}
}
/**
* 判断是否参加活动成功
*
* @param startTime 活动开始时间
* @param endTime 活动结束时间
* @param joinTime 参加活动时间
* @return 是否参加活动成功
*/
public static boolean whetherSucceed(Date startTime, Date endTime, Date joinTime) {
return joinTime.after(startTime) && joinTime.before(endTime);
}
}
c.Calendar
Calendar概述:
- Calendar代表了系统此刻日期对应的日历对象。
- Calendar是一个抽象类,不能直接创建对象。
Calendar日历类创建日历对象的方法:
方法名
说明
public static Calendar getInstance()
获取当前日历对象。
Calendar常用方法:
方法名
说明
public int get(int field)
取日期中的某个字段信息。
public void set(int field, int value)
修改日历的某个字段信息。
public void add(int field, int amount)
为某个字段增加/减少指定的值。
public final Date getTime()
拿到此刻日期对象。
public long getTimeInMillis()
拿到此刻时间毫秒值。
注意:Calendar是可变日期对象,一旦修改后其对象本身表示的时间将产生变化。
Test.java
import java.util.Calendar;
import java.util.Date;
public class Test {
public static void main(String[] args) {
// | 方法名 | 说明 |
// | public int get(int field) | 取日期中的某个字段信息。 |
// | public void set(int field, int value) | 修改日历的某个字段信息。 |
// | public void add(int field, int amount) | 为某个字段增加/减少指定的值。 |
// | public final Date getTime() | 拿到此刻日期对象。 |
// | public long getTimeInMillis() | 拿到此刻时间毫秒值。 |
/* 获取日历对象 */
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
/* 获取日期中的某个字段信息 */
int year = calendar.get(Calendar.YEAR);
System.out.println(year + "年");
// 月份从0开始计算
int month = calendar.get(Calendar.MONTH) + 1;
System.out.println(month + "月");
int day = calendar.get(Calendar.DATE);
System.out.println(day + "日");
// 今天是一年中的第几天
int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println("第" + dayOfYear + "天");
/* 修改日历的某个字段信息 */
// 修改当前日历对象的时间
calendar.set(Calendar.HOUR, 19);
System.out.println(calendar.get(Calendar.HOUR));
/* 为某个字段增加/减少指定的值 */
// 64天后的日期
calendar.add(Calendar.DAY_OF_YEAR, 64);
/* 拿到此刻日期对象 */
Date date = calendar.getTime();
System.out.println(date);
/* 拿到此刻时间毫秒值 */
long time = calendar.getTimeInMillis();
System.out.println(time);
}
}
总结:
-
Calendar如何去得到日历对象的?
// 获取当前日历对象 public static Calendar getInstance()
2.JDK8新增日期类
a.概述、LocalTme/LocalDate/LocalDateTime
Ⅰ.概述
- 从Java8开始,java.time包提供了新