时间日期
Date
获取当前时间
//1、创建一个Date类对象:代表系统此时此刻的日期对象
Date d=new Date();
System.out.println(d);
获取时间对象的毫秒值
//2、获取时间毫秒值
long time= d.getTime();
System.out.println(time);
//或者直接调用
long time1=System.currentTimeMillis();
System.out.println(time1);
时间毫秒值 转换成 日期对象
long time2=System.currentTimeMillis();
Date d2=new Date(time2);
System.out.println(d2);
SimpleDateFormat
可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式。
也可以把字符串的时间形式解析成日期对象。
Date对象 ————》 2099年11月11日11:11:
时间毫秒值 ————》 2099年11月11日11:11:
y 年
M 月
d 日
H 时
m 分
s 秒
2023年02月12日 10:44 周日 上午
Date d=new Date();
SimpleDateFormat sbf=new SimpleDateFormat("yyyy年MM月dd日 HH:ss EEE a");
String rs=sbf.format(d);
System.out.println(rs);
解析时间
案例
请计算出 2021年08月06日11点11分11秒,往后走2天14小时49分06秒后的时间是多少
//1、把字符串拿到程序中来
String dataStr = "2021年08月06日 11:11:11";
//2、把字符串时间解析成对象:形式必须与解析时间完全一样。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = sdf.parse(dataStr);
//3.往后走2天14小时 49分 06秒
long time = d.getTime() + (2L * 24 * 60 * 60 + 14 * 60 * 60 + 49 * 60 + 6) * 1000;
//4.格式化这个时间毫秒值就是结果
System.out.println(sdf.format(time));
JDK8后新增日期类
LocalDate:不包含具体时间的日期。
LocalTime:不含日期的时间。
LocalDateTime:包含了日期及时间。
Instant:代表的是时间戳、
DateTimeFormatter用于做时间的格式化和解析的。
Duration:用于计算两个“时间”间隔。
Period:用于计算两个“日期”间隔。
新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。
其次,新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改。
LocalDateTime修改相关的API
LocalDateTime 综合了 LocalDate 和 LocalTime 里面的方法,所以下面只用 LocalDate 和 LocalTime 来举例。
这些方法返回的是一个新的实例引用,因为LocalDateTime、LocalDate、LocalTime 都是不可变的。
方法名 |
说明 |
plusDays,plusWeeks,plusMonths,plusYears |
向当前 LocalDate 对象添加几天、几周、几个月、几年 |
minusDays,minusWeeks, minusMonths, minusYears |
从当前 LocalDate 对象减去几天、几周、几个月、几年 |
withDavofMonth,withDavofYear.withMonth,withYear |
将月份天数、年份天数、月份、年份修改为指定的值并返回新的LocalDate 对象 |
isBefore, isAfter |
比较两个 LocalDate |
包装类
其实就是8中基本类型对应的引用
基本数据类型 |
引用数据类型 |
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
char |
Character |
float |
Float |
double |
Double |
boolean |
Boolean |
为什么提供包装类?
java为了实现一切皆对象,为8种基本类型提供了对应的引用类型。
后面的集合和泛型其实也只能支持包装类型,不支持基本数据类型。
包装类可以将字符串转换整数
把String转换成int 。(字符串不可计算,转换成证书类型可以用于计算)
String number="23";
//转成整数
int age=Integer.valueOf(number);
System.out.println(age+1);
正则表达式
正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性
. |
任何字符 |
\d |
一个数字: [0-9] |
\D |
非数字: [^0-9】 |
\s |
一个空白字符: [tn\xOB\f\r] |
\S |
空白字符: [^\s】 |
\w |
[a-zA-Z_0-9]英文、数字、下划线 |
\W |
[^\w] 一个非单词字符 |
System.out.println("2442fsfsf".matches("\\w{6,}")); //验证是否是英文、数字、下划线、{6, 至少校验6个字符}
校验手机号是否正确:11位,1开头,第二位3-9
System.out.println("13355664545".matches( "1[3-9]\\d{9}"));
校验邮箱是否正确
System.out.println( "[email protected]".matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}"));
爬取数据
String rs = "来黑马程序学习Java,电话020-43422424,或者联系邮箱" +
"[email protected],电话18762832633,0203232323" +
"邮箱[email protected],400-100-3233 ,4001003232";
//需求:从上面内容中爬取出 电话号码和邮箱。
//1、定义爬取规则,字符串形式
String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|" +
"(1[3-9]\\d{9})|(0\\d{2,6}-?\\d{2,20})|(400-?\\d{3,9}-?\\d{3,9})";
//2、把这个爬取规则编译成匹配对象。 1[3-9{9}]
Pattern pattern = Pattern.compile(regex);
//3、得到一个内容匹配容器对象
Matcher matcher = pattern.matcher(rs);
//4、开始找了
while (matcher.find()) {
String rs1 = matcher.group();
System.out.println(rs1);
}
Arrays类
数组操作工具类,专门用于操作数组元素的。
Arrays类的常用API
方法名 |
说明 |
public static String toString(类型a) |
对数组进行排序 |
public static void sort(类型门a) |
对数组进行默认升序排序 |
public static void sort(类型a,Comparator<? super T> c) |
更用比较器对象自定义排序 |
public static int binarySearch(intil a, int key) |
分搜索数组中的数据,存在返回索引,不存在返回-1 |
toString直接打印数组arr
System.out.println(Arrays.toString(arr));
排序arr数组
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
二分搜索技术(前提数组必须排序才支持)
Arrays
自定义排序规则
设置Comparator接口对应的比较器对象,来定制比较规则
如果认为左边数据大于右边数据返回正整数
如果认为左边数据 小子 右边数据 返回负整数
如果认为左边数据 等于 右边数据 返回0
Integer[] ages = {34, 12, 50, 16};
/**
参数一:被排序的数组 必须是引用类型的元素
参数二:匿名内部类对象,代表了一个比较器对象。
*/
Arrays.sort(ages, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//指定比较规则
// return o1-o2;//默认升序
return o2-o1;//默认降序
}
});
System.out.println(Arrays.toString(ages));
二分查找技术
从数组中间对比大小,如果查的数比中间大,砍掉小的一半,如此循环,直到找到数据位置。
数组的二分查找的实现步骤
定义变量记录左边和右边位置
使用while循环控制查询(条件是左边位置<=右边位置
循环内部获取中间元素索引
判断当前要找的元素如果大于中间元素,左边位置=中间索引+1
判断当前要找的元素如果小于中间元素,右边位置=中间索引-1
判断当前要找的元素如果等于中间元素,返回当前中间元素索引
常见算法
Lambda表达式枚举
Lambda概述
Lambda表达式是]DK 8开始后的一种新语法形式。
作用:简化匿名内部类的代码写法
Lambda表达式的简化格式
(匿名内部类被重写方法的形参列表)->{
被重写方法的方法体代码。
}
注:-> 是语法形式,无实际含义
注意: Lambda表达式只能简化函数式接口的匿名内部类的写法形式
什么是函数式接口?
首先必须是接口、其次接口中有且仅有一个抽象方法的形式.
通常我们会在接口上加上一个@Functionallnterface注解,标记该接口必须是满足函数式接口。
Lambda表达式的省略写法(进一步在Lambda表达式的基础上继续简化)
参数类型可以省略不写
如果只有一个参数,参数类型可以省略,同时()也可以省略
如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略”."不写