Java-常用API、Lambda、常见算法

目录

一、日期与时间

1.Date

2.SimpleDateFormat

3.Calendar

 二、JDK8新增日期类

1.概述、LocalTime/LocalDate/LocalDateTime

 2.Instant

3.DateTimeFormatter 

4.Duration/Period

​编辑 5.ChronoUnit

三、包装类

四、正则表达式

1.正则表达式概述、初体验

2.正则表达式的匹配机制

3.正则表达式的常见案例

4.正则表达式在方法中的应用

5.正则表达式爬取知识

五、Arrays类

1.Arrays类概述、常用功能演示

2.Arrays类对于Comparator比较器的支持

 六、常见算法

1.选择排序

2.二分查找

七、Lambda表达式

1.Lambda概述

2.Lambda实战-简化常见函数接口

3.Lambda表达式的省略规则


一、日期与时间

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));
    }
}

3.Lambda表达式的省略规则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮卡丘√

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值