目录
1.概述、LocalTime/LocalDate/LocalDateTime
一、日期与时间
1.Date
Date类概述:Date类的对象在Java中代表的是当前所在系统的此刻日期时间
package com.pikaqiu.d1_date;
import java.util.Date;
public class DateDemo1 {
public static void main(String[] args) {
//创建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);
System.out.println("----------------------");
//需求:计算出当前时间往后走1h121s之后的时间
//1.得到当前时间毫秒值
Date d1 = new Date();
System.out.println(d1);
//2.当前时间往后走1h121s
long time2 = System.currentTimeMillis();
time2 += ( 60 * 60 + 121) * 1000;
//3.把时间毫秒值转为对应的日期对象
// Date d2 = new Date(time2);
// System.out.println(d2);
Date d3 = new Date();
d3.setTime(time2);
System.out.println(d3);
}
}
2.SimpleDateFormat
作用:1.可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式;2.也可以把字符串的时间形式解析成日期对象
package com.pikaqiu.d2_simpledateformat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SampleDateFormatDemo1 {
public static void main(String[] args) {
//1.创建日期对象
Date d = new Date();
System.out.println(d);
//2.格式化这个对象(指定最终格式化的形式)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE a");
//3.开始格式化日期对象成为喜欢的字符串形式
String rs = sdf.format(d);
System.out.println(rs);
System.out.println("-----------------");
//4.格式化时间毫秒值
//121s之后的时间
long time = System.currentTimeMillis() + 121 * 1000;
String rs2 = sdf.format(time);
System.out.println(rs2);
}
}
package com.pikaqiu.d2_simpledateformat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo2 {
public static void main(String[] args) throws ParseException {
//需求:计算出2021年08月06日11点11分11秒,往后走2天14小时49分06秒后的时间是多少
//1.把字符串时间拿到程序中去
String dateStr = "2021年08月06日 11:11:11";
//2.把字符串时间解析成日期对象(重点):时间必须与被解析的时间形式完全一样,否则运行时解析会报错
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = sdf.parse(dateStr);
//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));
}
}
package com.pikaqiu.d2_simpledateformat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo3 {
public static void main(String[] args) throws ParseException {
//1.开始、结束时间
String startTime = "2020-11-11 00:00:00";
String endTime = "2020-11-11 00:10:00";
//2.小贾、小皮抢购时间
String xiaoJia = "2020-11-11 00:03:47";
String xiaoPi = "2020-11-11 00:10:11";
//3.解析他们的时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = sdf.parse(startTime);
Date d2 = sdf.parse(endTime);
Date d3 = sdf.parse(xiaoJia);
Date d4 = sdf.parse(xiaoPi);
if(d3.after(d1) && d3.before(d2)){
System.out.println("小贾秒杀成功^^");
}else{
System.out.println("小贾秒杀失败~~~");
}
if(d4.after(d1) && d4.before(d2)){
System.out.println("小皮秒杀成功^^");
}else{
System.out.println("小皮秒杀失败~~~");
}
}
}
3.Calendar
Calendar概述:1.Calendar代表了系统此刻日期对应的日历对象;2.Calendar是一个抽象类,不能直接创建对象
package com.pikaqiu.d3_calendar;
import java.util.Calendar;
import java.util.Date;
public class CalenderDemo1 {
public static void main(String[] args) {
//1.拿到系统此刻的日历对象
Calendar cal = Calendar.getInstance();
System.out.println(cal);
//2.获取日历的信息
int year = cal.get(Calendar.YEAR);
System.out.println(year);
int month = cal.get(Calendar.MONTH) + 1;
System.out.println(month);
int day = cal.get(Calendar.DAY_OF_YEAR);
System.out.println(day);
//3.修改日历的某段信息
// cal.set(Calendar.HOUR , 12);
// System.out.println(cal);
//4.为某个字段增加/减少指定的值
cal.add(Calendar.DAY_OF_YEAR,60);
cal.add(Calendar.MINUTE,59);
//5.拿到此刻的日期对象
Date d = cal.getTime();
System.out.println(d);
//6.拿到此刻的时间毫秒值
long time = cal.getTimeInMillis();
System.out.println(time);
}
}
二、JDK8新增日期类
1.概述、LocalTime/LocalDate/LocalDateTime
LocalTime/LocalDate/LocalDateTime:他们分别表示日期,时间,日期时间对象,他们的类的实例是不可以改变的对象;他们三者构建对象和API都是通用的
2.Instant
3.DateTimeFormatter
在JDK8中,引入了一个全新的日期与时间格式器DateTimeFormatter;正反都能调用format方法
4.Duration/Period
5.ChronoUnit
ChronoUnit类可用于在单个时间单位内测量一段时间,这个工具是最全的,可以用于比较所有的时间单位
三、包装类
包装类:其实就是8中基本数据类型对应的引用类型
为什么提供包装类:1.Java为了实现一切皆对象,为8种基本数据类型提供了相应的引用类型;后面的集合和泛型其实也只能支持包装类型,不支持基本数据类型
package com.pikaqiu.d5_integer;
public class Test {
public static void main(String[] args) {
int a = 10;
Integer a1 = 11;
Integer a2 = a; //自动装箱
System.out.println(a);
System.out.println(a1);
Integer it = 100;
int it1 = it; //自动拆箱
System.out.println(it1);
//int age = null; //报错
Integer age1 = null;
System.out.println("---------------------");
Integer i3 = 23;
String rs = i3.toString();
System.out.println(rs + 1); //231
String rs1 = Integer.toString(i3);
System.out.println(rs + 1); //231
String rs2 = i3 + "";
System.out.println(rs2 + 1); //231
System.out.println("---------------------");
String number = "23";
//转成整数
int age = Integer.valueOf(number);
System.out.println(age + 1); //24
String number1 = "99.9";
//转成小数
double score = Double.valueOf(number1);
System.out.println(score + 0.1);
}
}
四、正则表达式
1.正则表达式概述、初体验
正则表示:正则表达式可以用一些规定的字符来制定规则,并用来效验数据格式的合法性
package com.pikaqiu.d6_regex;
public class RegexDemo1 {
public static void main(String[] args) {
//需求:校验QQ号,必须全部是数字 6-20位
System.out.println(checkQQ("2345678"));
System.out.println(checkQQ("23568789d45"));
System.out.println(checkQQ(null));
System.out.println(checkQQ("23444"));
System.out.println("--------------------");
//正则表达式初体验
System.out.println(checkQQ2("2345678"));
System.out.println(checkQQ2("23568789d45"));
System.out.println(checkQQ2(null));
System.out.println(checkQQ2("23444"));
}
public static boolean checkQQ2(String qq){
return qq != null && qq.matches("\\d{6,20}");
}
public static boolean checkQQ(String qq){
//首先判断长度是否符合要求
if(qq == null || qq.length() < 6 || qq.length() > 20){
return false;
}
//判断字符里面是否全部是数字
for (int i = 0; i < qq.length(); i++) {
char ch = qq.charAt(i);
if(ch < '0' || ch > '9'){
return false;
}
}
return true;
}
}
2.正则表达式的匹配机制
3.正则表达式的常见案例
package com.pikaqiu.d6_regex;
import java.util.Scanner;
public class RegexDemo2 {
public static void main(String[] args) {
checkNumber();
}
public static void checkNumber(){
Scanner sc = new Scanner(System.in);
boolean flag = true;
while(flag){
System.out.println("请输入号码");
String number = sc.next();
if(number.matches("\\d{11}") ||
number.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}")){
System.out.println("输入正确~~~");
flag = false;
}else {
System.out.println("请重新输入~~~");
}
}
}
}
4.正则表达式在方法中的应用
package com.pikaqiu.d6_regex;
public class RegexDemo3 {
public static void main(String[] args) {
String names = "小路asdfsdfsd23蓉儿sfasfs564过儿";
String[] arrs = names.split("\\w+");
for (int i = 0; i < arrs.length; i++) {
System.out.println(arrs[i]);
}
String names2 = names.replaceAll("\\w+"," ");
System.out.println(names2); //小路 蓉儿 过儿
}
}
5.正则表达式爬取知识
package com.pikaqiu.d6_regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo4 {
public static void main(String[] args) {
String rs = "在黑马学习Java,电话020-43422424,或者联系邮箱" +
"itcast@itcast.cn,电话18762832633,0203232323" +
"邮箱bozai@itcast.cn,400-100-3223,4001003232";
//定义爬取规则
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{5,20})|" +
"(400-?\\d{3,9}-?\\d{3,9})";
//把爬取规则编译成匹配对象
Pattern pattern = Pattern.compile(regex);
//得到一个内容匹配器对象
Matcher matcher = pattern.matcher(rs);
//开始爬取
while (matcher.find()){
String rs1 = matcher.group();
System.out.println(rs1);
}
}
}
五、Arrays类
1.Arrays类概述、常用功能演示
Arrays类概述:数组操作工具类,专门用于操作数组元素的
package com.pikaqiu.d7_arrays;
import java.util.Arrays;
public class ArraysDemo1 {
public static void main(String[] args) {
int[] arr = {10,2,6,8,4};
System.out.println(arr);
// //1.返回数组内容
// String rs = Arrays.toString(arr);
// System.out.println(rs);
System.out.println(Arrays.toString(arr));
//2.对数组进行升序排序
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
//3.二分搜索技术(前提数组必须排好序,否则会出bug)
//返回不存在元素的规律: - (应该插入的位置索引+1)
int index = Arrays.binarySearch(arr,55);
System.out.println(index);
}
}
2.Arrays类对于Comparator比较器的支持
package com.pikaqiu.d7_arrays;
import java.util.Arrays;
import java.util.Comparator;
public class ArraysDemo2 {
public static void main(String[] args) {
//Arrays的sort方法对于有值特性的数组是默认升序排序
int[] ages = {18,30,20,16};
Arrays.sort(ages);
System.out.println(Arrays.toString(ages)); //[16, 18, 20, 30]
//需求:降序排序(自定义比较器对象,只能支持引用类型的排序)
Integer[] ages1 = {25,30,15,28};
/**
* 参数一:被排序的数组,必须是引用类型的元素
* 参数二:匿名内部类对象,代表了一个比较器对象
*/
Arrays.sort(ages1, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//指定比较规则
// if(o1 > o2){
// return 1;
// }else if(o1 < o2){
// return -1;
// }
// return 0;
//return o1-o2; //默认升序
return o2-o1; //降序
}
});
System.out.println(Arrays.toString(ages1));
System.out.println("-----------------------------------");
Student[] students = new Student[3];
students[0] = new Student("张三",28,168.8);
students[1] = new Student("李四",18,178.5);
students[2] = new Student("王五",38,185.3);
System.out.println(Arrays.toString(students));
//Arrays.sort(students); //运行崩溃
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
//自己指定比较规则
//return o1.getAge()-o2.getAge(); //按照年龄升序排序
//return o2.getAge()-o1.getAge(); //按照年龄降序排序
//return Double.compare(o1.getHeight(),o2.getHeight()); //比较浮点型,按照身高升序
return Double.compare(o2.getHeight(),o1.getHeight()); //比较浮点型,按照身高降序
}
});
System.out.println(Arrays.toString(students));
}
}
六、常见算法
1.选择排序
选择排序思想:每轮选择当前位置,开始找出后面的较小值与该位置交换
选择排序的关键:1.确定总共要选择的轮数---数组的长度-1;2.控制每轮从以前为基准,与后面元素选择几次
package com.pikaqiu.d8_sort_binarysearch;
import java.util.Arrays;
public class Test1 {
public static void main(String[] args) {
int[] arr = {1,3,5,6,9,2,7,4,8};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i] > arr[j]){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
2.二分查找
二分查找性能好,但是二分查找的前提必须是排好序的数据
package com.pikaqiu.d8_sort_binarysearch;
import java.util.Arrays;
public class Test2 {
public static void main(String[] args) {
int[] arr = {10,63,45,12,98,75,32};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
int index = binarySearch(arr,63);
System.out.println(index);
}
public static int binarySearch(int[] arr,int num){
int min = 0;
int max = arr.length-1;
while(min <= max){
int middle = (max + min)/2;
if(num == arr[middle]){
return middle;
}else if(num < arr[middle]){
max = middle - 1;
}else {
min = middle + 1;
}
}
return -1;
}
}
七、Lambda表达式
1.Lambda概述
Lambda表达式是JDK8开始后的一种新语法形式
作用:简化匿名内部类的代码写法
Lambda表达式的简化格式:(匿名内部类被重写方法的形参列表)->{被重写方法的方法体代码}
注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式
什么是函数式接口:1.首先必须是接口、其次接口中有且仅有一个抽象方法的形式;2.通常我们会在接口上加上一个@FunctionalInterface注解,标记该接口必须是满足函数式接口
package com.pikaqiu.d9_lambda;
public class LambdaDemo2 {
public static void main(String[] args) {
// Swimming s1 = new Swimming() {
// @Override
// public void swim() {
// System.out.println("老师游泳贼6");
// }
// };
Swimming s1 = ()->{
System.out.println("老师游泳贼6");
};
go(s1);
System.out.println("---------------------------");
go(()->{
System.out.println("老师游泳贼6");
});
}
public static void go(Swimming s){
System.out.println("开始");
s.swim();
System.out.println("结束");
}
}
@FunctionalInterface //一旦加上这个注解就必须是函数式接口,里面只能有一个抽象方法
interface Swimming{
void swim();
}
2.Lambda实战-简化常见函数接口
package com.pikaqiu.d9_lambda;
import java.util.Arrays;
public class LambdaDemo3 {
public static void main(String[] args) {
Integer[] ages1 = {25,30,15,28};
/**
* 参数一:被排序的数组,必须是引用类型的元素
* 参数二:匿名内部类对象,代表了一个比较器对象
*/
Arrays.sort(ages1,(Integer o1, Integer o2)->{
return o2-o1;
});
System.out.println(Arrays.toString(ages1));
}
}