时间、正则表达式、Arrays类、Lambda(doy4)

时间日期

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不写,同时也必须省略”."不写

猜你喜欢

转载自blog.csdn.net/m0_74608954/article/details/128997018