常用类2

常用类2

日期时间api的使用.

一、JDK8之前的API:

  1. System类的currentTimeMillis(

  • 获取当前时间对应的毫秒数,long类型,时间戳
  • 当前时间与1970年1月1日0时0分0秒之间的毫秒数
  • 常用来计算时间差
package com.xin.cylei.demo02;
/*
Date类的使用
/--java.util.Date
>两个构造器的使用
>两个方法的使用:①toString() 2long getTime()
l ----java.sql.Date:对应着数据库中的date类型

 */
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Day83101 {
    public static void main(String[] args) {
        Day83101 da = new Day83101();
//        da.test1();
//        da.test2();
        da.test4();
    }
    public void test1(){
        Date date1=new Date();//创建一个基于当前系统时间的Date的实例
        System.out.println(date1.toString());//Thu Aug 31 14:34:02 CST 2023
        long time = date1.getTime();
        System.out.println("对应的毫秒数为:"+time);//1693463642785

        Date date2 = new Date(1193463503047l);//创建一个基于指定时间戳的Date的实例
        System.out.println(date2.toString());//Sat Oct 27 13:38:23 CST 2007
    }
    public void test2(){
        java.sql.Date date3=new java.sql.Date(1393463503047l);
        System.out.println(date3.toString());//2014-02-27
        System.out.println(date3.getTime());//1393463503047
    }

    /*
    SimpleDateFormat类:用于日期时间的格式化和解析
    格式化:日期--->字符串
    解析:字符串--->日期

     */
    public void test3(){
        SimpleDateFormat sdf = new SimpleDateFormat();
        //格式化:日期--->字符串
        Date date = new Date();
        String format = sdf.format(date);
        System.out.println(format);//23-8-31 下午2:46

        // 解析:字符串--->日期
        Date date1 = null;
        try {
            date1 = sdf.parse("23-8-31 下午8:46");
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        System.out.println(date1);
    }
    public void test4(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        //格式化:日期--->字符串
        Date date = new Date();
        String format = sdf.format(date);
        System.out.println(format);//2023-08-31 02:54:14
    }
}

  /*
    calendar:日历类
实例化由于Calendar是一个抽象类,所以我们需要创建其子类的实例。这里我们通过Calendar的静态方法
getInstance()即可获取

     */
    public void test5(){
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getClass());//class java.util.GregorianCalendar
        //测试方法
        //get(int field)
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//31
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//5
        //set(int field,xx)
        calendar.set(Calendar.DAY_OF_MONTH,23);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//23
        //add(int field,xx)
        calendar.add(Calendar.DAY_OF_MONTH,3);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//26

        //gettime
        Date time = calendar.getTime();
        System.out.println(time);//Sat Aug 26 15:12:07 CST 2023

        //setTime()∶使用指定Date重置Calendar
        Date date = new Date();
        calendar.setTime(date);
        System.out.println(calendar.getTime());//Thu Aug 31 15:14:51 CST 2023
    }
    /*
    拓展:
将控制台获取的年月日(比如: 2022-12-13)的字符串数据,保存在数据库中。
(简化为得到java.sql.Date的对象,此对象对应的时间为2022-12-13) .*
*字符串---> java.util.Date ---> java.sql.Date

     */
    public void test6() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String pattern="2022-12-13";
        //得到java.util.Date
        Date date = null;
        try {
            date = sdf.parse(pattern);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        //转换为java.sql.Date
        java.sql.Date date1 = new java.sql.Date(date.getTime());
        System.out.println(date1);//2022-12-13

    }
  • 可变性:像日期和时间这样的类应该是不可变的。
  • 偏移性: Date中的年份是从1900开始的,而月份都从0开始。
  • 格式化:格式化只对Date有用,Calendar则不行。
  • 此外,它们也不是线程安全的;不能处理闰秒等。

JDK8:新的日期时间API

4.1本地日期时间:LocalDate、LocalTime、LocalDateTime

image-20230831153811945

二、JDK8中的API:

  1. LocalDate ,LocalTime ,LocalDateTime --->类似于Calendar
    • 实例化:now() / of(xxx ,xx ,xX)
    • 方法: get() / withXxx() l plusxxx() l minusXxx() ...
    private void test1() {
        //now()∶获取当前日期和时间对应的实例
        LocalDate localDate=LocalDate.now();
        LocalTime localTime=LocalTime.now();
        LocalDateTime localDateTime=LocalDateTime.now();
        System.out.println(localDate);//2023-08-31
        System.out.println(localTime);//15:44:24.449
        System.out.println(localDateTime);//2023-08-31T15:44:24.449

        //of():
        LocalDate d1 = LocalDate.of(2021, 5, 6);
        LocalDateTime d2 = LocalDateTime.of(2021, 5, 6, 11, 11, 11);
        System.out.println(d1);
        System.out.println(d2);//2021-05-06T11:11:11

        //getxxx()
        LocalDateTime localDateTime1=LocalDateTime.now();
        System.out.println(localDateTime1.getDayOfMonth());
        //体现不可变性
        // withXxx ()
        LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(15);
        System.out.println(localDateTime1);
        System.out.println(localDateTime2);

        LocalDateTime localDateTime3 = localDateTime1.plusDays(5);
        System.out.println(localDateTime1);//2023-08-31T15:55:11.501
        System.out.println(localDateTime3);//2023-09-05T15:55:11.501
    }

4.2瞬时:Instant

  • Instant:时间线上的一个瞬时点。这可能被用来记录应用程序中的事件时间戳。
    • 时间戳是指格林威治时间1970年o1月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

image-20230831160200833

    private void test2() {
        //now()
        Instant instant=Instant.now();//伦敦时间
        System.out.println(instant);//2023-08-31T08:03:53.333Z

        Instant instant1 = Instant.ofEpochMilli(1654135416l);
        System.out.println(instant1);//1970-01-20T03:28:55.416Z
    }
  1. Instant:瞬时--->类似于Date
    • 实例化: now() / ofEpochMilli
    • 方法: toEpochMilli()
 //JDK8的api: DateTimeFormatter
    private void test3() {
        //自定义的格式。如: ofPattern( "yyyy-MM-dd hh : mm : ss")
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh : mm : ss");
        //格式化:日期、时间-->字符串
        LocalDateTime localDateTime=LocalDateTime.now();
        String format = dateTimeFormatter.format(localDateTime);
        System.out.println(format);//2023-08-31 04 : 14 : 24

        //解析:字符串--->日期、时间
//        TemporalAccessor parse = dateTimeFormatter.parse("2023-08-31 04 : 14 : 24");
//        LocalDateTime from = LocalDateTime.from(parse);
//        System.out.println(from);
    }

---

5.Java比较器

1.实现对象的排序,可以考虑两种方法:自然排序、定制排序

2.方式一:实现Comparable接口的方式
实现步骤:
  1. 具体的类A实现Comparable接口
  2. 重写Comparable接口中的compareTo(0bject obj)方法,在此方法中指明比较类A的对象的大小的标准
  3. 创建类A的多个实例,进行大小的比较或排序。
package com.xin.cylei.demo02;

public class Product implements Comparable{
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    /**
     * 当前的类需要实现Comparable中的抽象方法: compareTo(0bject o)
     * 在此方法中,指明如何判断当前类的对象的大小。比如:按照价格的高低进行大小的比较。(或从低到高排序)
     * 如果返回值是正数:当前对象大。如果返回值是负数:当前对象小。如果返回值是0,一样大。
     * @param o the object to be compared.
     * @return
     */
    @Override
    public int compareTo(Object o) {
       if (o==this){
           return 0;
       }
        if (o instanceof Product){
            Product p=(Product) o;
            return Double.compare(this.price,p.price);
        }
        //手动抛出一个异常类的对象
        throw new RuntimeException("类型不匹配");
    }
}
=====
    package com.xin.cylei.demo02;

import java.util.Arrays;

/*

 */
public class Day83103 {
    public static void main(String[] args) {
        Day83103 da = new Day83103();
        da.test2();
    }
    public void test1(){
        String[] arr= new String[]{"xiaomi","Tom","Jerry","Tony","Jeck"};
        Arrays.sort(arr);
        //排序后,遍历
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    public void test2(){
        Product[] arr=new Product[5];
        arr[0]=new Product("dht",4521);
        arr[1]=new Product("stvvs",5634);
        arr[2]=new Product("dgtre",7854);
        arr[3]=new Product("xded",1587);
        arr[4]=new Product("aaa",2456);
        Arrays.sort(arr);
        //排序后,遍历
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

3.方式二:实现Comparato接口的方式

实现步骤:

  1. 创建一个实现了Comparator接口的实现类A
  2. 实现类A要求重写Comparator接口中的抽象方法compare(0bject o1,0bject o2),在此方法中指明要比较大小的对象的大小关系。(比如,String类、Product类)
  3. 创建此实现类A的对象,并将此对象传入到相关方法的参数位置即可。(比如:Arrays.sort(..,类A的实例))
public void test3(){
        Product[] arr1=new Product[5];
        arr1[0]=new Product("dht",4521);
        arr1[1]=new Product("stvvs",5634);
        arr1[2]=new Product("dgtre",7854);
        arr1[3]=new Product("xded",1587);
        arr1[4]=new Product("aaa",2456);
        //创建一个实现了Comparator接口的实现类的对象
        Comparator comparator=new Comparator() {
            //如果判断两个对象o1,o2的大小,其标准就是此方法的方法体要编写的逻辑。
            //比如:按照价格从高到低排序

            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof Product && o2 instanceof Product){
                    Product p1=(Product) o1;
                    Product p2=(Product) o2;
                    return -Double.compare(p1.getPrice(),p2.getPrice());
                }
                throw new RuntimeException("类型不匹配");

            }
        };
        Arrays.sort(arr1,comparator);
        //排序后,遍历
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
    }

4.对比两种方式:

  • 角度一:
    自然排序:单一的,唯一的定制排序:灵活的,多样的
  • 角度二:
    自然排序:一劳永逸的定制排序:临时的
  • 角度三:细节
    自然排序:对应的接口是Comparable,对应的抽象方法compareTo(Object obj)
    定制排序:对应的接口是Comparator,对应的抽象方法compare(Object obj1,0bject obj2)

image-20230901093620045

  1. system类

属性: out、 in、 err
方法: currentTimeMillis() / gc() / exit(int status) / getProperty(String property)

  1. Runtime类

对应着Java进程的内存使用的运行时环境,是单例的

  1. Math类

凡是与数学运算相关的操作,大家可以在此类中找相关的方法即可

  1. BigInteger类和BigDecimal类

    BigInteger:可以表示任意长度的整数

    BigDecimal:可以表示任意精度的浮点数

  2. Random类

获取指定范围的随机整数:nextInt(int bound)


复习

1.String类

  • String的声明: final修饰、实现了Comparable接口.

  • String的不可变性

  • String的两种定义方式:字面量的定义方式 string s = "hello" 2.new的方式:

    • String s = new String("hello");oString的内存解析:字符串常量池、堆内存的使用
    • String s = new String("hello");在内存中创建的对象的个数。
  • String的连接操作:+

  • 常量+常量、变量+常量、变量+变量、concat(String otherString)o

  • String intern()

  • 熟悉String的构造器、与其他结构之间的转换、常用方法

    • 编码和解码
      • 编码:字符、字符串-->字节、字节数组。对应着编码集
      • 解码:字节、字节数组-->字符、字符串。对应着解码集
      • 规则:解码集必须使用当初编码时使用的编码集。只要不一致,就可能出现乱码!
  • string相关的算法问题。

2.StringBuffer、StringBuilder类

  • [面试题]string、StringBuffer、StringBuilder的区别
  • 知道什么场景下使用stringBuffer、StringBuilder

3.jdk8之前的日期、时间API

  • System的currentTimeMillis()
  • 两个Date的使用
  • simpleDateFormat用于格式化、解析
  • Calendar日历类的使用

4.jdk8中新的日期、时间API

  • LocalDate、LocalTime、LocalDateTime -->类似于calendaro
  • lnstant -->类似于Date
  • DateTimeFormatter --->类似于simpleDateFormat

5.比较器(重点)

  • 自然排序涉及到comparable
    • compareTo(Object obj)
  • 定制排序涉及到comparator
    • compare(Object obj1,Object obj2)

面试题

  1. String中“+”怎样实现? (阿*)

    • 常量+常量:略
    • 变量+常量、变量+变量:创建一个StringBuilder的实例, 通过append(添加字符串,最后调用toString()返回1个字符串。(toString()内部new -个String的实例)

9.subString()到底做了什么?(银*数据)

String str = "hello";

String subStr = str.subString(1,3);//底层是new的方式返回一个subStr,实体内容是"el"

posted @   新至所向  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示