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.Date
→java.util.Date
:多态,java.sql.Date extends java.util.Date
java.util.Date
→java.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)
- 格式化 [日期(Date) → 文本(String)]:
- 举例说明
@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 }
- 字符串"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());
- 渔夫从 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的迭代:
- JDK1.0 Date 类
- JDK1.1 Calendar 类,一定程度上替换 Date 类
- JDK1.8 提出的新 API
5.1 LocalXxx
- 新时间日期的包
java.time
– 包含值对象的基础包java.time.chrono
– 提供对不同的日历系统的访问java.time.format
– 格式化和解析时间和日期java.time.temporal
– 包括底层框架和扩展特性java.time.zone
– 包含时区支持的类
LocalDate
、LocalTime
、LocalDateTime
类是其中较重要的几个类,它们的实例是不可变的对象,分别表示使用 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_TIME
;ISO_LOCAL_DATE
;ISO_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)
- 一般的 Float 类和 Double 类可以用来做科学计算或工程计算,但在商业计算中,要求数字精度比较高,故用到