day04——常用API

YangeIT大约 23 分钟JavaSE进阶多态final继承

day04——常用API

学习目标

各位同学,昨天我们已经把学了一部分API,今天继续来学习开发常用的API。

今天学习的内容同学们学习起来会更实在一些,有一些语法知识只需要了解一下 就可以了,因为实际工作用得并不多,其他的需要能理解运用即可,具体情况如下:👇

红心代表重要,梨子代表理解(重点是理解,不是运用),火箭代表了解一下,铅笔代表多练练

  1. StringBuilder类 🍐 ❤️ ✏️
  2. StringJoiner类 🍐 ✏️
  3. Math类 🍐 ✏️
  4. System类 🚀
  5. Runtime类 🚀
  6. BigDecimal类 🍐 ✏️ ❤️
  7. Date类 🍐🚀
  8. SimpleDateFormat类 🍐🚀
  9. Calendar类 🍐🚀
  10. LocalDate类、LocalTime类、LocalDateTime类 🍐✏️ ❤️
  11. 时区ZoneId类 🍐 、Instant类 🍐 、DateTimeFormater日期格式化类✏️、Period和Duration时间间隔类 🍐 ✏️

1. StringBuilder类

StringBuilder类

  • StringBuilder代表可变字符串对象 ,相当于是一个容器,它里面的字符串是可以改变的,就是用来操作字符串的。
  • 好处StringBuilder比String更合适做字符串的修改操作,效率更高,代码也更加简洁。

代码操作

1.1 StringBuilder方法演示

接下来我们用代码演示一下StringBuilder的用法

public class Test{
    public static void main(String[] args){
        StringBuilder sb = new StringBuilder("itehima");
        
        //1.拼接内容
        sb.append(12);
        sb.append("黑马");
        sb.append(true);
        
        //2.append方法,支持临时编程
        sb.append(666).append("黑马2").append(666);
        System.out.println(sb); //打印:12黑马666黑马2666
        
        //3.反转操作
        sb.reverse();
        System.out.println(sb); //打印:6662马黑666马黑21
        
        //4.返回字符串的长度
        System.out.println(sb.length());
        
        //5.StringBuilder还可以转换为字符串
        String s = sb.toString();
        System.out.println(s); //打印:6662马黑666马黑21
    }
}

为什么要用StringBuilder对字符串进行操作呢?因为它的效率比String更高,我们可以下面两段代码验证一下。

1667402173587
1667402173587
public class Test1 {
    public static void main(String[] args) {
//        String s = "";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 1000000; i++) {
//            s = s + "abc";
            sb.append("abc");
        }
//        System.out.println(s);
        System.out.println(sb.toString());
    }
}

经过我的验证,直接使用Stirng拼接100万次,等了1分钟,还没结束,我等不下去了;但是使用StringBuilder做拼接,不到1秒钟出结果了。

image
image

总结

课堂作业

  1. String和StringBuilder区别和应用场景?🎤 image

2. StringJoiner类

StringJoiner类

image
image

接下来,我们学习一个类叫做StringJoiner,学习这个类干嘛用呢?是因为我们前面使用StringBuilder拼接字符串的时,代码写起来还是有一点麻烦,而StringJoiner号称是拼接神器,不仅效率高,而且代码简洁。

下面演示一下StringJoiner的基本使用


public class Test3{
    public static void main(String[] args){
        StringJoiner s = new StringJoiner(",");
        s.add("韩立");
        s.add("南宫婉");
        s.add("铁柱");
        System.out.println(s); //结果为: 韩立,南宫婉,铁柱
        
        //参数1:间隔符
        //参数2:开头
        //参数3:结尾
        StringJoiner s1 = new StringJoiner(",","[","]");
        s1.add("韩立");
        s1.add("南宫婉");
        s1.add("铁柱");
        System.out.println(s1); //结果为: [韩立,南宫婉,铁柱]
    }
}

使用StirngJoiner改写前面把数组转换为字符串的案例

public class Test2{
    public static void main(String[] args){
        String str = getArrayData( new int[]{11,22,33});
        System.out.println(str);
    }
    
    //方法作用:将int数组转换为指定格式的字符串
    public static String getArrayData(int[] arr){
        //1.判断数组是否为null
        if(arr==null){
            return null;
        }
        //2.如果数组不为null,再遍历,并拼接数组中的元素
        StringJoiner s = new StringJoiner(", ","[","]");
        for(int i=0; i<arr.length; i++){
            //加""是因为add方法的参数要的是String类型
            s.add(String.valueOf(arr[i]));
        }
        //3、把StringJoiner转换为String,并返回。
        return s.toString();
    }
}













 


 





总结

课堂作业

  1. 为什么要用StringJoiner?相比StringBuilder有什么不同?🎤
  2. 使用StringJoiner完成之前数组转字符串的改造!!✏️

3. Math类、System类、Runtime类、BigDecimal类 🍐

Math类

image
image

Math类🍐、System类🚀、Runtime类🚀、BigDecimal类❤️

代码操作

image
image

Math是数学的意思,该类提供了很多个进行数学运算的方法,如求绝对值,求最大值,四舍五入 等,话不多说,直接上代码。

public class MathTest {
    public static void main(String[] args) {
        // 目标:了解下Math类提供的常见方法。
        // 1、public static int abs(int a):取绝对值(拿到的结果一定是正数)
        //    public static double abs(double a)
        System.out.println(Math.abs(-12)); // 12
        System.out.println(Math.abs(123)); // 123
        System.out.println(Math.abs(-3.14)); // 3.14

        // 2、public static double ceil(double a): 向上取整
        System.out.println(Math.ceil(4.0000001)); // 5.0
        System.out.println(Math.ceil(4.0)); // 4.0

        // 3、public static double floor(double a): 向下取整
        System.out.println(Math.floor(4.999999)); // 4.0
        System.out.println(Math.floor(4.0)); // 4.0

        // 4、public static long round(double a):四舍五入
        System.out.println(Math.round(3.4999)); // 3
        System.out.println(Math.round(3.50001)); // 4

        // 5、public static int max(int a, int b):取较大值
        //   public static int min(int a, int b):取较小值
        System.out.println(Math.max(10, 20)); // 20
        System.out.println(Math.min(10, 20)); // 10

        // 6、 public static double pow(double a, double b):取次方
        System.out.println(Math.pow(2, 3)); // 2的3次方   8.0
        System.out.println(Math.pow(3, 2)); // 3的2次方   9.0

        // 7、public static double random(): 取随机数 [0.0 , 1.0) (包前不包后)
        System.out.println(Math.random());
    }
}

总结

课堂作业

image
image
  1. 如果给整数求平方,使用哪个类?🎤
  2. 如果要退出JVM虚拟机要使用哪个类?🎤
  3. 如果要算出计算机的核数,使用哪个类?🎤
  4. 如果要进行金融货币计算,或者进行科学实验计算,需要用到哪个类?🎤
  5. 如果对小数处理,保留2位小数,使用哪个类?

4. Date类 SimpleDateFormat类 Calendar类 🍐🚀

时间相关类

image
image

Date类 SimpleDateFormat类 Calendar类 🍐🚀老的,了解一下

代码操作

接下来,我们学习一下Date类,Java中是由这个类的对象用来表示日期或者时间。

Date对象记录的时间是用毫秒值来表示的。Java语言规定,1970年1月1日0时0分0秒认为是时间的起点,此时记作0,那么1000(1秒=1000毫秒)就表示1970年1月1日0时0分1秒,依次内推。

1667399304240
1667399304240

下面是Date类的构造方法,和常见的成员方法,利用这些API写代码尝试一下

1667399443159
1667399443159
public class TestDate {
    public static void main(String[] args) {
        // 目标:掌握Date日期类的使用。
        // 1、创建一个Date的对象:代表系统当前时间信息的。
        Date d = new Date();
        System.out.println(d);

        // 2、拿到时间毫秒值。
        long time = d.getTime();
        System.out.println(time);

        // 3、把时间毫秒值转换成日期对象: 2s之后的时间是多少。
        time += 2 * 1000;
        Date d2 = new Date(time);
        System.out.println(d2);

        // 4、直接把日期对象的时间通过setTime方法进行修改
        Date d3 = new Date();
        d3.setTime(time);
        System.out.println(d3);
    }
}
image
image

总结

课堂作业

  1. 2024年08月02日 23:58:13转成 2024-08-02 23:58:13🎤 image

5. JDK8新增日期类

JDK8新增日期类

image
image

八、为什么JDK8要新增日期类

/**
 *  目标:搞清楚为什么要用JDK 8开始新增的时间类。
 */
public class Test7 {
    public static void main(String[] args) {
        // 传统的时间类(Date、SimpleDateFormat、Calendar)存在如下问题:
        // 1、设计不合理,使用不方便,很多都被淘汰了。
        Date d = new Date();
        System.out.println(d.getYear());
        System.out.println(d.getYear() + 1900);//2024

        Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        System.out.println(year);//2024

        // 2、都是可变对象,修改后会丢失最开始的时间信息。

        // 3、线程不安全(后期再讲)。

        // 4、不能精确到纳秒,只能精确到毫秒。
        // 1秒 = 1000毫秒
        // 1毫秒 = 1000微妙
        // 1微妙 = 1000纳秒
    }
}
image
image

代码操作

  • LocalDate类的基本使用
public class Test1_LocalDate {
    public static void main(String[] args) {
        // 0、获取本地日期对象(不可变对象)
        LocalDate ld = LocalDate.now(); // 年 月 日
        System.out.println(ld);
        System.out.println("-------------------");

        // 1、获取日期对象中的信息
        int year = ld.getYear(); // 年
        int month = ld.getMonthValue(); // 月(1-12)
        int day = ld.getDayOfMonth(); // 日
        int dayOfYear = ld.getDayOfYear();  // 一年中的第几天
        int dayOfWeek = ld.getDayOfWeek().getValue(); // 星期几
        System.out.println(year);
        System.out.println(day);
        System.out.println(dayOfWeek);
        System.out.println("-------------------");
        // 2、直接修改某个信息: withYear、withMonth、withDayOfMonth、withDayOfYear
        LocalDate ld2 = ld.withYear(2099);
        LocalDate ld3 = ld.withMonth(12);
        System.out.println(ld2);
        System.out.println(ld3);
        System.out.println(ld);
        System.out.println("-------------------");

        // 3、把某个信息加多少: plusYears、plusMonths、plusDays、plusWeeks
        LocalDate ld4 = ld.plusYears(2);
        System.out.println(ld4);
        LocalDate ld5 = ld.plusMonths(2);
        System.out.println(ld5);
        System.out.println("-------------------");

        // 4、把某个信息减多少:minusYears、minusMonths、minusDays、minusWeeks
        LocalDate ld6 = ld.minusYears(2);
        LocalDate ld7 = ld.minusMonths(2);
        System.out.println(ld6);
        System.out.println(ld7);
        System.out.println("-------------------");

        // 5、获取指定日期的LocalDate对象: public static LocalDate of(int year, int month, int dayOfMonth)
        LocalDate ld8 = LocalDate.of(2099, 12, 12);
        LocalDate ld9 = LocalDate.of(2099, 12, 12);

        // 6、判断2个日期对象,是否相等,在前还是在后: equals isBefore isAfter
        System.out.println(ld8.equals(ld9));// true
        System.out.println(ld8.isAfter(ld)); // true
        System.out.println(ld8.isBefore(ld)); // false
        System.out.println("-------------------");
    }
}

总结

课堂作业

  1. 求出今天的最早和最晚的时间,结合LocalDateTime和LocalDate来实现项目常用,必练🎤

  2. 判断一个时间,是否超过了30分钟,如果超过了就取消订单用于支付超时,取消订单

6. JDK8日期(格式化器)

JDK8日期(格式化器)

十、JDK8日期(时区)

十一、JDK8日期(Instant类)

十二、JDK8日期(格式化器)

代码操作

十二、JDK8日期(格式化器)

接下来,我们学习一个新增的日期格式化类,叫DateTimeFormater。它可以从来对日期进行格式化和解析。它代替了原来的SimpleDateFormat类。

1667401511710
1667401511710

需要用到的方法,如下图所示

1667401564173
1667401564173

接下来,将上面的方法用代码来演示一下

/**
 *  目标:掌握JDK 8新增的DateTimeFormatter格式化器的用法。
 */
public class Test6_DateTimeFormatter {
    public static void main(String[] args) {
        // 1、创建一个日期时间格式化器对象出来。
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");

        // 2、对时间进行格式化
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

        String rs = formatter.format(now); // 正向格式化
        System.out.println(rs);

        // 3、格式化时间,其实还有一种方案。
        String rs2 = now.format(formatter); // 反向格式化
        System.out.println(rs2);

        // 4、解析时间:解析时间一般使用LocalDateTime提供的解析方法来解析。
        String dateStr = "2029年12月12日 12:12:11";
        LocalDateTime ldt = LocalDateTime.parse(dateStr, formatter);
        System.out.println(ldt);
    }
}

日期格式化&解析案例

1667400116263
1667400116263

public class Test8 {
    public static void main(String[] args) throws ParseException {
        // 目标:完成秒杀案例。
        // 1、把开始时间、结束时间、小贾下单时间、小皮下单时间拿到程序中来。
        String start = "2023年11月11日 00:00:00";
        String end = "2023年11月11日 00:10:00";
        String xjia = "2023年11月11日 00:01:18";
        String xpi = "2023年11月11日 00:10:57";

        // 2、把字符串的时间解析成日期对象。

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        LocalDateTime startorderTime = LocalDateTime.parse(start, formatter);
        LocalDateTime endorderTime = LocalDateTime.parse(end, formatter);
        LocalDateTime xjiaTime = LocalDateTime.parse(xjia, formatter);
        LocalDateTime xpiTime = LocalDateTime.parse(xpi, formatter);

        // 3、开始判断小皮和小贾是否秒杀成功了。
        if (xjiaTime.isAfter(startorderTime) && xjiaTime.isBefore(endorderTime)) {
            System.out.println("小贾秒杀成功!");
        } else {
            System.out.println("小贾秒杀失败!");
        }

        if (xpiTime.isAfter(startorderTime) && xpiTime.isBefore(endorderTime)) {
            System.out.println("小皮秒杀成功!");
        } else {
            System.out.println("小皮秒杀失败!");
        }


    }
}
小贾秒杀成功!
小皮秒杀失败!

7. 时间间隔

时间间隔

十三、JDK8日期(Period类)

除以了上新增的类,JDK8还补充了两个类,一个叫Period类、一个叫Duration类;这两个类可以用来对计算两个时间点的时间间隔。

其中Period用来计算日期间隔(年、月、日),Duration用来计算时间间隔(时、分、秒、纳秒)

1667401637360
1667401637360

先来演示Period类的用法,它的方法如下图所示。可以用来计算两个日期之间相隔的年、相隔的月、相隔的日。只能两个计算LocalDate对象之间的间隔

1667401886743
1667401886743
/**
 * 目标:掌握Period的作用:计算机两个日期相差的年数,月数、天数。
 */
public class Test7_Period {
    public static void main(String[] args) {
        LocalDate start = LocalDate.of(2029, 8, 10);
        LocalDate end = LocalDate.of(2029, 12, 15);

        // 1、创建Period对象,封装两个日期对象。
        Period period = Period.between(start, end);

        // 2、通过period对象获取两个日期对象相差的信息。
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }
}

总结

课堂作业

  1. 算出来这学习Java到现在有多少分钟了🎤
  2. 算出你表白到现在,你和你对象度过了多少天,多少分钟?

课后作业

🚩 1. 重点完成上述的课堂作业

  1. 晚自习第一节课的前30分钟,总结完毕之后,每个同学先必须梳理今日知识点 (记得写不知道的,以及感恩三件事);整理好的笔记可以发给组长,组长交给班长,意在培养大家总结的能力)

  2. 晚自习第一节课的后30分钟开始练习(记住:程序员是代码堆起来的):

    • 先要把今天的所有案例或者课堂练习,如果没练完的,练完他
    • 完成讲师发送在班级群中的作业,提交位置关注群里
    • 不懂要多问,问同学,问老师,问百度,都可以!! 独自解决分析问题,解决问题的能力-----编程思维!!
  3. 剩余的时间:预习第二天的知识,预习的时候一定要注意:

  • 预习不是学习,不要死看第二天的视频(很容易出现看了白看,为了看视频而看视频)
  • 预习看第二天的笔记,把笔记中标注重要的知识,可以找到预习视频,先看一遍,如果不懂的 ,记住做好标注。