JDK核心类
- 包装类
- Math/Random/UUID
- 日期类
包装类
将基本数据进行一个封装,形成对应的数据类型
Byte、Short、Integer、Long、Float、Double、Character、Boolean
Number 用来表示数字,是 Byte、Short、Integer、Long、Float、Double的父类、Number是一个抽象类
Number 中定义了 6个方法,分别是 byteValue , shortValue … doubleValue 分别返回对应的基本数据类型,这6个方法是将包装类转成基本数据类型的方法
基本数据类型对应的包装类 都是 final 修饰的,不允许被继承、且实现了 Comparable接口,代表可以比较两个对象的大小
包装类是一个引用数据类型,所以包装类对应的属性默认值是 null
定义包装类对应的对象
// JDK9 过时
Integer in = new Integer(3) ;
// JDK9 过时
Integer in = new Integer("3") ;
// 通过 包装类提供的 valueOf 静态方法 构造对象
Integer.valueOf(3) ; // 将基本数据类型转换成包装类
Integer.valueOf("3") ;
Integer.valueOf("abc", 16) ;
Boolean.valueOf(str) :
如果 str 的内容为 true 字符串(忽略大小写),则结果为 true ,否则 均为 false
基本数据类型 和 包装类的相互转换
- 基本数据类型转成包装类
Integer.valueOf(3) ;
- 将包装类转成基本数据类型
Integer x = ...... ;
x.intValue() ;
自动封箱和自动拆箱
- 自动封箱: 将基本数据类型自动转成与之对应的包装类
工作原理: 将基本数据类型对应的值作为 valueOf 的参数,转成包装类
- 自动拆箱: 将包装类转成对应的基本数据类型
工作原理: 会将包装类对应的对象自动调用 xxxValue() 方法,进行拆箱
数字类型的包装类对应的Cache(缓存)
== :如果比较的是基本数据类型,那么比较的是值是否相等,如果比较的是引用类型,那么比较的是地址
Integer a = 100 ;
Integer b = 100 ;
a == b // true
Integer a = 1000;
Integer b = 1000 ;
a == b // false
包装类(整数) 在进行值判断是否相等的时候,必须用 equals , 如果用 == , 在 -128 ~ 127之间的内容比较的时候都是 true
整数对应的包装类中,都定义了一个 XxxCache, 类中定义一个 final 修饰的 cache 数组
cache 数组中,初始化了256个数据,且 存放的是 -128 ~ 127
在进行自动封箱的时候,会默认调用 valueOf 静态方法, 将传入的基本类型对应值进行一个判断
如果值在 -128 ~ 127 之间,那么会从 cache 缓存中获取该值(值只要相同,每次得到的都是同一个对象)
如果值不在 这个区间、会使用 new 调用对应的构造方法创建对象(无论值是否相同,地址都不会一样)
其它
-
包装类中的常见静态方法
-
Xxx.parseXxx() : 将字符串转成对应的数字
Interger.parseInt(str) :
Double.parseDouble(str):
-
Xxx.valueOf() : 将字符串转成对应的数字
-
Integer.toBinaryString : 转2进制
-
Integer.toOctalString : 转8进制
-
Integer.toHexString :转16进制
-
Integer.toString(n, radix) : 将 n 转成 radix 对应的进制
-
MAX_VALUE : 最大值
-
MIN_VALUE : 最小值
Math
封装了大量的数学方法、可以完成一些常见的数学运算
Math 是一个工具类、里面内置的都是 静态方法,直接使用类调用即可
- abs(x) : 求一个数的绝对值
- max(a, b) : 求两个数字的最大值
- min(a, b):
- pow(a, b) : 求 a的 b次方, 返回是一个 double 类型
- sqrt(a) : 获取一个数字的算术平方根
- ceil(a) : 向上取整、返回 double
- floor(a) : 向下取整、返回 double
- round(a) : 四舍五入、返回 int
- sin(弧度) : 弧度 = 度 / 180 * Π
- random() : 返回一个 0 ~ 1 (不包含1)的随机小数
- 返回一个 3 ~ 100之间的随机数。 Math.random() * (上限 - 下限) + 下限
Random
专门用来实现产生随机数的一个类
new Random().nextInt(n) : 产生一个 0 ~ N 之间的随机整数
UUID
用来产生一个随机的且不会重复的字符串
UUID.randomUUID() : 随机产生一个 长度为 36的 不会重复的字符串
日期和时间
- Date : 用来表示日期的一个类、表示的是一个瞬时时间
构造方法
- new Date() : 创建一个当前系统时间
- new Date(long) : 创建一个距离 1970-1-1的毫秒数对应的时间
常见的方法
- compareTo(Date date) : 比较两个日期大小
- before(Date date) : 判断是否在传入的日期之前
- after(Date date) : 判断是否在传入的日期之后
- getTime() : 获取 距离 1970-1-1的毫秒数
- setTime() : 设置 距离 1970-1-1的毫秒数
SimpleDateFormat
进行简单日期格式化的一个类、专门服务于Date
创建一个 SimpleDateFormat 对象
new SimpleDateFormat(pattern)
常见的 pattern 支持的日期格式有
-
yyyy : 代表 四位数的年份
-
MM : 代表 2位数的月份、不够位数、前面补0
-
dd : 代表 2位数的天、不够位数、前面补0
-
HH : 代表 24进制的小时
-
hh : 代表 12进制的小时
-
mm : 代表 2位数的 分钟
-
ss : 代表 2位数的 秒
-
SSS : 代表 3位数的 毫秒
-
E : 代表星期
常见的方法
- format(Date date) : 将一个日期按照指定的pattern 转成字符串
Date date = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
String x = df.format(date)
- parse(String str) : 将一个字符串按照指定的pattern解析成日期对象
String time = "2022-01-11"
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd") ;
Date date = df.parse(time)
Calendar (日历类)
是一个抽象类、不能直接创建对象,但可以通过 静态方法 getInstance() 快速构建一个日历类
Calendar 定义的 常量 非常重要
Calendar calendar = Calender.getInstance();
常见的基本方法
- calendar.getTime() : 将 日历转成 日期Date
- calendar.setTime(Date date) : 将一个日历 重置到 指定的 日期
- set(year, month , day) : 将 一个日历 重置到指定的年月日,月份从0开始,0代表 1月
- set(year, month ,day, hour, min, sec) :
常见的 常量
- YEAR :年份
- MONTH :月份
- WEEK_OF_YEAR : 一年的第几周
- WEEK_OF_MONTH : 一月的第几周
- DAY_OF_MONTH / DATE : 一个月第几天
- DAY_OF_YEAR : 一年的第几天
- DAY_OF_WEEK : 星期
- HOUR : 12进制小时
- HOUR_OF_DAY : 24进制小时
- MINUTE : 分钟
- SECOND : 秒
- MILLISECOND : 毫秒
- SUNDAY , MONDAY , … : 星期 (1 代表周日,… , 7 代表 周六)
- JANUARY , FEBRUARY , …: 月份 (0 代表 1月, … 11 代表 12月)
- AM : 上午
- PM : 下午
和 常量 相关的 日历方法
- add(field , amount) : field 就是 Calendar 中定义的常量(只能使用和时间相关的常量)
Calendar calendar = Calendar.getInstance();
// 将日历 的月份增加 3月
calendar.add(Calendar.MONTH, 3) ;
- set(field, value) : 修改指定的常量代表的含义对应的值
Calendar calendar = Calendar.getInstance();
// 将日历 的月份设置 4月
calendar.set(Calendar.MONTH, 3) ;
- get(field) : 根据常量代表的含义获取对应的信息
Calendar calendar = Calendar.getInstance();
// 获取 当前 日历是 星期几
calendar.get(Calendar.DAY_OF_WEEK) ;
-
getActualMaximum(field) : 获取指定属性在日历对应的时间中的最大值
-
getActualMinimum(field) : 获取指定属性在日历对应的时间中的最小值
使用 Calendar 打印 某一个年的 某个月对应的日历
JDK8 新增的日期API (java.time包)
- LocalDateTime : 一个处理 日期和时间的类
- LocalDate : 一个处理 日期的类
- LocalTime :一个处理 时间的类
表示时间的精度度可以精确到 纳秒
使用 静态方法 创建对象的方式
LocalDateTime.now() : 创建一个当前时间的日期和时间对象
LocalDateTime.of(int year, int month , int day, int hour, int min) :
LocalDateTime.of(int year, int month , int day, int hour, int min, int sec) :
LocalDateTime.of(int year, int month , int day, int hour, int min, int sec, int na…) :
新版日期格式化类 DateTimeFormatter
- 将 日期格式化为字符串
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd")
df.format(LocalDate.now()) ;
- 将字符串解析成日期
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd")
LocalDate date = LocalDate.parse(str, df) ;
日期的增量操作
- plusXxx(n) : 增加多少
LocalDate date = LocalDate.now();
date.plusYears(1) // 增加 1年
date.plus(1, ChronoUnit.DAYS) // 增加 1天
date.plus(Duration.ofSeconds(3)) // 增加 3秒
-
minusXxx(n) : 减少多少, 具体用法详见 plusXxx
-
withXxx(n) : 重置时间和日期
now.withHour(3) : 重置 时间为 3点
now.with(ChronoField.HOUR_OF_DAY , 3):重置 时间为 3点
now.with(LocalDate.of(1999, 11, 11)): 重置 日期为 1999-11-11,时间不变
-
getXxx() : 获取 对应的 日期属性信息
-
get(ChronoField) : 获取 对应的 日期属性信息
时区
TimeZone 老版时区
- TimeZone.getAvailableIDs() : 获取计算机识别的所有时区, 返回 String[]
- TimeZone.getDefault(): 获取 默认时区 (Asia/Shanghai)
- TimeZone.getTimeZone(“Asia/Chongqing”) : 获取指定的时区
ZoneId 新版时区
- ZoneId.getAvailableZoneIds() : 获取计算机识别的所有时区, 返回 Set
- ZoneId.systemDefault() : 获取 默认时区 (Asia/Shanghai)
- ZoneId.of(“America/Bahia”) : 获取指定的时区
ZonedDateTime (带有时区的时间)
用法和 LocalDateTime 相同,比LocalDateTime多了一个时区ZoneId
时间间隔 Duration
-
Duration.ofDays(n) : 间隔多少天
-
Duration.ofHours(n) : 间隔多少小时
-
Duration.ofMinutes(n): 间隔多少分
-
Duration.ofSeconds(n): 间隔多少秒
-
Duration.ofMillis(n): 间隔多少毫秒
-
Duration.ofNanos(n): 间隔多少纳秒
-
Duration.between(a, b) : 获取两个日期间隔的时间
Instant 高精度的日期类
作用 和 Date 一样, 可以精确到 纳秒