20-常用API

1. System

  • System 类代表系统,系统级的很多属性和控制方法都放置在该类的内部;该类位于 java.lang 包。
  • 由于该类的构造器是 private 的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是 static 的,所以也可以很方便的进行调用。
  • 变量
    • public static final InputStream in“标准”输入流。此流已打开并准备提供输入数据
    • public static final PrintStream out“标准”输入流。此流已打开并准备提供输入数据
    • public static final PrintStream err“标准”错误输出流。此流已打开并准备接受输出数据
  • 常用方法
    • native long currentTimeMillis():该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数
    • void exit(int status):该方法的作用是退出程序。其中 status 的值为 0 代表正常退出,非零代表异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等
    • void gc():该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况
    • String getProperty(String key):该方法的作用是获得系统中属性名为 key 的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:

2. Date

  • 构造器
    • Date():使用无参构造器创建的对象可以获取本地当前时间
    • Date(long date):分配 Date 对象并初始化此对象,以1970 年 1 月 1 日 00:00:00 GMT 以来的指定毫秒数
  • 常用方法
    • getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数
    • toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy;其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz 是时间标准,例如:Tue Jul 07 18:02:40 GMT+08:00 2020
  • java.sql.Date ←→ java.util.Date
    • java.sql.Datejava.util.Date:多态,java.sql.Date extends java.util.Date
    • java.util.Datejava.sql.Date
      java.util.Date d1 = new java.util.Date();
      java.sql.Date d2 = new java.sql.Date(d1.getTime());
      

3. SimpleDateFormat

  • 作用:Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化解析日期 Date 的具体类
    • public SimpleDateFormat():默认的模式和语言环境创建对象
    • public SimpleDateFormat(String pattern):该构造方法可以用参数模式pattern指定的格式创建一个对象
  • 定义了以下模式字母
  • 2 个操作
    • 格式化 [日期(Date) → 文本(String)]:public String format(Date date)
    • 解析 [文本(String) → 日期(Date)]:public Date parse(String source)
  • 举例说明
    @Test
    public void test() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        // 格式化
        String format = sdf.format(new Date());
        System.out.println(format); // 2020-07-08
        // 解析
        Date date = sdf.parse("1998-10-18 07:00:00");
        System.out.println(date); // Sun Oct 18 00:00:00 GMT+08:00 1998
    }
    
  1. 字符串"2020-07-08" 转换成 java.sql.Date 对象
    String str = "2020-07-08";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    java.util.Date date1 = sdf.parse(str);
    java.sql.Date date2 = new java.sql.Date(date1.getTime());
    
  2. 渔夫从 1990-01-01 开始,三天打鱼两天晒网,问 2020-07-08 他在干嘛?
    public void test2() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date start = sdf.parse("1990-01-01");
        Date end = sdf.parse("2020-07-08");
        long day = (end.getTime() - start.getTime())/(1000*60*60*24) + 1;
        // day % 5 == 1, 2, 3 → 打鱼
        // day % 5 == 4, 0 → 晒网
        System.out.println(day % 5);
    }
    

4. Calendar

  • Calendar 是一个抽象基类,主用用于完成日期字段之间相互操作的功能
  • 获取 Calendar 实例的方法:Calendar.getInstance() // 底层调用它的子类 GregorianCalendar 的构造器
  • 常用方法
    • public int get(int field)
    • public void set(int field, int value)
    • public void add(int field, int amount)
    • public final Date getTime()
    • public final void setTime(Date date)
  • 注意
    • 获取月份时:一月是0,二月是1,...,12月是11
    • 获取星期时:周日是1,周二是2,...,周六是7
// get()
int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));

// set()
//calendar可变性
calendar.set(Calendar.DAY_OF_MONTH, 22);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);

// add()
calendar.add(Calendar.DAY_OF_MONTH, -3); // 减
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);

// getTime(): 日历类 → Date
Date date = calendar.getTime();
System.out.println(date);

// setTime(): Date → 日历类
Date date1 = new Date();
calendar.setTime(date1);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);

5. JDK8 新日期时间 API

日期时间API的迭代:

  1. JDK1.0 Date 类
  2. JDK1.1 Calendar 类,一定程度上替换 Date 类
  3. JDK1.8 提出的新 API

5.1 LocalXxx

  • 新时间日期的包
    • java.time – 包含值对象的基础包
    • java.time.chrono – 提供对不同的日历系统的访问
    • java.time.format – 格式化和解析时间和日期
    • java.time.temporal – 包括底层框架和扩展特性
    • java.time.zone – 包含时区支持的类
  • LocalDateLocalTimeLocalDateTime 类是其中较重要的几个类,它们的实例是不可变的对象,分别表示使用 ISO-8601 日历系统的日期、时间、日期和时间。 它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息
    • LocalDate 代表IOS格式(yyyy-MM-dd) 的日期
    • LocalTime 表示一个时间,而不是日期
    • LocalDateTime 是用来表示日期和时间的,这是一个最常用的类之一(类似于Calendar)
  • 常用方法
public void test() {
    // now(): 获取当前的日期、时间、日期时间
    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDate); // 2020-07-08
    System.out.println(localTime); // 20:03:16.986
    System.out.println(localDateTime); // 2020-07-08T20:03:16.987

    // of(...): 以指定时间生成一个日期对象(没有偏移量,dont worries)
    LocalDateTime localDateTime1 = LocalDateTime.of(1998, 10, 18, 07, 30, 13);
    System.out.println(localDateTime1);

    // getXxx(): 获取相关属性
    System.out.println(localDateTime.getDayOfMonth());
    System.out.println(localDateTime.getDayOfWeek());
    System.out.println(localDateTime.getMonthValue());
    System.out.println(localDateTime.getDayOfYear());

    // withXxx(...): 设置相关属性;体现不可变性
    LocalDate localDate1 = localDate.withDayOfMonth(21);
    System.out.println(localDate.getDayOfMonth());
    System.out.println(localDate1.getDayOfMonth());
    System.out.println(localDate1 == localDate); // false
    LocalDateTime localDateTime2 = localDateTime.withHour(1);
    System.out.println(localDateTime.getHour());
    System.out.println(localDateTime2.getHour());

    // plusXxx(...): 原有基础上增加;体现不可变性
    LocalDateTime localDateTime3 = localDateTime.plusMonths(2);
    System.out.println(localDateTime.getMonth());
    System.out.println(localDateTime3.getMonth());

    // minusXxx(...): 原有基础上删去;体现不可变性
    LocalDateTime localDateTime4 = localDateTime.minusHours(6);
    System.out.println(localDateTime.getHour());
    System.out.println(localDateTime4.getHour());
}

5.2 Instant

  • Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳
  • 在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位
  • java.time 包通过值类型Instant提供机器视图,不提供处理人类意义上的时间单位。Instant 表示时间线上的一点,而不需要任何上下文信息,例如,时区。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC) 开始的秒数。因为 java.time 包是基于纳秒计算的,所以 Instant 的精度可以达到纳秒级
  • (1 ns = 10-9 s) 1秒 = 1000毫秒 = 10^6 微秒 = 10^9 纳秒
  • 常用方法
public void test1() {
    // now(): 中时区(本初子午线) 的时间
    Instant instant = Instant.now();
    System.out.println(instant); // 2020-07-08T12:33:23.603Z
    OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));// 东八区
    System.out.println(offsetDateTime); // 2020-07-08T20:33:23.603+08:00|
    // 返回1970-01-01 00:00:00到当前时间的毫秒数
    long milli = instant.toEpochMilli();
    System.out.println(milli);
    // 返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
    Instant instant1 = Instant.ofEpochMilli(milli);
    System.out.println(instant1);
    // Instant 类似于 java.util.Date
}

5.3 DateTimeFormatter

  • java.time.format.DateTimeFormatter 类,该类提供了 3 种格式化方法:
    • 预定义的标准格式,如:ISO_LOCAL_DATE_TIMEISO_LOCAL_DATEISO_LOCAL_TIME
    • 本地化相关的格式,如:ofLocalizedDateTime(FormatStyle.LONG)
    • 自定义的格式,如:ofPattern("yyyy-MM-dd hh:mm:ss")
  • 演示格式1、格式3
    public void test2() {
        // 方式1:预定义的标准格式
        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        // LocalDate, LocalTime, LocalDateTime 均实现 TemporalAccessor<I>
        LocalDateTime now = LocalDateTime.now();
        // --- 格式化
        String str1 = formatter.format(now);
        System.out.println(str1); // 2020-07-08T20:53:15.267
        // --- 解析
        TemporalAccessor accessor = formatter.parse("2020-07-08T20:53:15.267");
        System.out.println(accessor); // {},ISO resolved to 2020-07-08T20:53:15.267
    
        // 方式3:自定义的格式
        DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        // --- 格式化
        String str4 = formatter3.format(now);
        System.out.println(str4); // 2020-07-08 09:15:44
        // --- 解析
        TemporalAccessor accessor1 = formatter3.parse("2010-08-15 08:00:00");
        System.out.println(accessor1); // {SecondOfMinute=0, NanoOfSecond=0, MilliOfSecond=0,
        // HourOfAmPm=8, MicroOfSecond=0, MinuteOfHour=0},ISO resolved to 2010-08-15
    }
    
  • 演示格式2

6. 比较器

  • 在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题
  • Java实现对象排序的方式有 2 种:
    • 自然排序:java.lang.Comparable
    • 定制排序:java.util.Comparator

6.1 自然排序(Comparable)

  • Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
    public interface Comparable<T> {
        public int compareTo(T o);
    }
    
  • 实现 Comparable 接口的对象列表(和数组)可以通过 Collections.sort()Arrays.sort() 进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器
  • 重写 compareTo 方法的规则:
    • 如果 this 大于形参对象 obj,则返回正整数
    • 如果 this 小于形参对象 obj,则返回负整数
    • 如果 this 等于形参对象 obj,则返回 0
  • Comparable 的典型实现(默认都是从小到大排列的):
    • String:按照字符串中字符的 Unicode 值进行比较
    • Character:按照字符的 Unicode 值来进行比较
    • 数值类型对应的包装类以及 BigInteger、BigDecimal:按照它们对应的数值大小进行比较
    • Boolean:true 对应的包装类实例大于 false 对应的包装类实例
    • Date、Time等:后面的日期时间比前面的日期时间大

6.2 定制排序(Comparator)

  • 当元素的类型没有实现 java.lang.Comparable 接口而又不方便修改代码, 或者实现了 java.lang.Comparable 接口的排序规则不适合当前的操作,那 么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排序的比较
    public interface Comparator<T> {
        int compare(T o1, T o2);
    }
    
  • 重写 compare(Object o1, Object o2),比较 o1 和 o2 的大小:
    • 返回正整数,表示 o1 大于 o2
    • 返回负整数,表示 o1 小于 o2
    • 返回 0,表示 o1 和 o2 相等
  • Comparable<I>Comparator<I> 使用上的对比
    • Comparable<I> 的方式一旦指定,保证 Comparable<I> 接口实现类的对象在任何位置上都可以比较大小
    • Comaprator<I> 属于临时性的比较

7. Math

java.lang.Math 提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double型

8. BigInteger、BigDecimal

  • BigInteger
    • Integer 类作为 int 的包装类,能存储的最大整型值为 2^31 - 1,Long 类也是有限的, 最大为2^63 - 1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类 都无能为力,更不用说进行运算了。
    • java.math 包的 BigInteger 可以表示不可变的任意精度的整数。BigInteger 提供 所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。 另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、 位操作以及一些其他操作
    • 构造器:BigInteger(String val) 根据字符串构建 BigInteger 对象
    • 常用方法
  • BigDecimal
    • 一般的 Float 类和 Double 类可以用来做科学计算或工程计算,但在商业计算中,要求数字精度比较高,故用到java.math.BigDecimal
    • BigDecimal 类支持不可变的、任意精度的有符号十进制定点数
    • 构造器
      • public BigDecimal(double val)
      • public BigDecimal(String val)
    • 常用方法
      • public BigDecimal add(BigDecimal augend)
      • public BigDecimal subtract(BigDecimal subtrahend)
      • public BigDecimal multiply(BigDecimal multiplicand)
      • public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
原文地址:https://www.cnblogs.com/liujiaqi1101/p/13283241.html