Java 基础核心总结篇:时间类 + 包装类 重点干货汇总
🏠个人主页:黎雁
🎬作者简介:C/C++/JAVA后端开发学习者
❄️个人专栏:C语言、数据结构(C语言)、EasyX、JAVA、游戏、规划、程序人生
✨ 从来绝巘须孤往,万里同尘即玉京
文章目录
- Java 基础核心总结篇:时间类 + 包装类 重点干货汇总 📚
Java 基础核心总结篇:时间类 + 包装类 重点干货汇总 📚
整合前三篇核心知识点,剔除冗余,全是干货!覆盖日常开发高频用法+面试考点,建议收藏备用~
📝 文章摘要
- 阅读时长:8 分钟
- 适合人群:
- 刚学完前三篇的同学 → 重点看:知识点梳理、易错点汇总,快速巩固记忆
- 准备面试/刷题的同学 → 重点看:核心考点、对比总结、高频提问点
- 日常开发备查 → 重点看:常用类、核心方法,直接对照使用
- 本文内容:整合 JDK7/JDK8 时间类、Java 包装类全部重点,按模块梳理,突出核心用法、易错点和面试高频考点,无冗余内容,纯干货汇总。
🧠 前三篇核心脉络回顾
- 第一篇(JDK7 时间类):传统时间 API(Date、SimpleDateFormat、Calendar),掌握基础用法,了解其设计痛点;
- 第二篇(JDK8 时间类):全新时间 API(LocalDate、LocalDateTime 等),重点掌握其不可变、线程安全的优势及高频用法;
- 第三篇(包装类):基本类型与引用类型的桥梁,核心掌握自动装箱拆箱、Integer 常量池、类型转换方法;
- 本篇核心:将前三篇知识点“去冗余、抓重点”,按模块汇总,方便复习、备查、应对面试。
一、时间类 重点干货汇总(JDK7 + JDK8)⏱️
(一)JDK7 时间类(传统 API)—— 了解用法,规避痛点
核心类:3个(Date、SimpleDateFormat、Calendar),重点掌握基础用法,明确其痛点,日常开发优先用 JDK8 替代。
1. Date 类(java.util.Date)
- 核心作用:表示一个瞬间,精确到毫秒(底层存储毫秒值,从 1970-01-01 00:00:00 UTC 开始);
- 核心方法(必记):
getTime():获取当前时间的毫秒值;setTime(long time):设置时间(通过毫秒值);
- 构造方法:
new Date()(当前时间)、new Date(long time)(指定毫秒值时间); - 痛点:方法命名不直观、不能单独操作年月日、线程不安全。
2. SimpleDateFormat 类(java.text.SimpleDateFormat)
- 核心作用:时间的格式化(Date → 字符串)和解析(字符串 → Date);
- 核心方法(必记):
format(Date date):格式化(重点,日常开发常用);parse(String source):解析(需处理 ParseException 异常);
- 常用格式:
yyyy-MM-dd HH:mm:ss(年月日时分秒); - 痛点:线程不安全(多线程环境下使用会出问题),JDK8 用 DateTimeFormatter 替代。
3. Calendar 类(java.util.Calendar)
- 核心作用:单独操作时间的年、月、日、时、分、秒(解决 Date 不能单独操作字段的问题);
- 核心要点(必记):
- 抽象类,不能直接 new,通过
Calendar.getInstance()获取对象; - 常用字段(面试常考):
Calendar.YEAR:年;Calendar.MONTH:月(0~11,需 +1 才是真实月份,大坑!);Calendar.DAY_OF_MONTH:日;Calendar.DAY_OF_WEEK:星期(1=周日,2=周一…7=周六,大坑!);
- 核心方法:
get(int field)(获取字段)、set(int field, int value)(修改字段)、add(int field, int amount)(增减字段);
- 抽象类,不能直接 new,通过
- 痛点:字段设计混乱(月份、星期起始值不合理)、线程不安全、API 不直观。
4. JDK7 时间类 易错点(必记)
- 中国是东八区,0 毫秒值对应时间是
1970-01-01 08:00:00(不是 00:00:00); - SimpleDateFormat 的 parse 方法必须处理异常,否则编译报错;
- Calendar 的月份 0 代表 1 月,11 代表 12 月;星期 1 代表周日,7 代表周六,实际开发必须转换。
(二)JDK8 时间类(全新 API)—— 重点掌握,日常首选
核心优势:不可变对象(线程安全)、API 直观、字段合理(月份112,星期17)、职责拆分清晰,是日常开发、面试的重点。
1. 核心类分工(必记,按使用频率排序)
| 类名 | 核心作用 | 包含信息 | 常用场景 |
|---|---|---|---|
| LocalDateTime | 日期+时间操作(高频) | 年月日时分秒 | 日志、订单时间、接口请求时间 |
| LocalDate | 纯日期操作(高频) | 年月日 | 生日、签到日期、订单日期 |
| LocalTime | 纯时间操作 | 时分秒纳秒 | 打卡时间、活动开始时间 |
| DateTimeFormatter | 时间格式化/解析(高频) | - | 替代 SimpleDateFormat |
| Period | 日期间隔计算 | 年月日间隔 | 计算两个日期的年/月/日差 |
| Duration | 时间间隔计算 | 时分秒毫秒间隔 | 计算两个时间的时/分/秒差 |
| ChronoUnit | 任意单位间隔计算 | 所有时间单位 | 灵活计算(年/月/日/时/分等) |
| ZoneId | 时区操作 | 时区信息 | 跨时区时间处理 |
| Instant | 时间戳(对应 Date) | UTC 时间点 | 时间戳记录、跨时区转换 |
2. 高频类 核心方法(必记,直接套用)
(1)LocalDate / LocalTime / LocalDateTime(三巨头)
通用套路(三者用法一致,仅字段不同):
- 获取对象:
XXX.now()(当前时间/日期)、XXX.of(...)(指定时间/日期); - 获取字段:
getYear()、getMonthValue()(月份1~12)、getDayOfMonth()、getHour()等; - 修改字段:
withYear(int)、withDayOfMonth(int)(返回新对象,原对象不变); - 增减字段:
plusYears(long)、minusDays(long)(返回新对象); - 时间比较:
isBefore(XXX)、isAfter(XXX)(返回 boolean); - 相互转换:LocalDateTime → LocalDate(
toLocalDate())、LocalDateTime → LocalTime(toLocalTime())。
(2)DateTimeFormatter(格式化解析)
- 核心方法:
DateTimeFormatter.ofPattern("格式")(创建格式化器)、format(时间对象)(格式化); - 常用格式:和 SimpleDateFormat 一致(
yyyy-MM-dd HH:mm:ss); - 优势:线程安全,无需处理异常(解析需处理 DateTimeParseException,频率极低)。
(3)时间间隔计算(Period / Duration / ChronoUnit)
- Period(年月日间隔):
Period.between(起始日期, 结束日期),方法getYears()、getMonths()、getDays(); - Duration(时分秒间隔):
Duration.between(起始时间, 结束时间),方法toDays()、toHours()、toMillis(); - ChronoUnit(任意单位):
ChronoUnit.单位.between(起始时间, 结束时间)(如ChronoUnit.YEARS.between(...)),最灵活。
3. JDK8 时间类 核心要点(必记)
- 所有时间类都是不可变对象,修改、增减时间都会返回新对象,原对象不变(线程安全的核心原因);
- 月份是 1~12,星期是 1~7(1=周一,7=周日),符合日常直觉,无需转换;
- 日常开发优先级:LocalDateTime > LocalDate > LocalTime,DateTimeFormatter 替代 SimpleDateFormat;
- Instant 是 UTC 时间戳,需绑定时区(
atZone(ZoneId))才能转换为本地时间。
(三)JDK7 vs JDK8 时间类 对比(面试高频)
| 对比维度 | JDK7 时间类 | JDK8 时间类 |
|---|---|---|
| 线程安全 | 不安全(如 SimpleDateFormat) | 安全(不可变对象) |
| 字段设计 | 混乱(月份0~11,星期1=周日) | 合理(月份1~12,星期1=周一) |
| API 直观性 | 差(方法命名不清晰) | 好(见名知意) |
| 职责拆分 | 模糊(Date 既表示时间又可格式化) | 清晰(按功能拆分类) |
| 日常开发推荐 | 不推荐(仅兼容旧代码) | 强烈推荐(首选) |
二、包装类 重点干货汇总(全考点)📦
核心定位:基本数据类型与引用类型的桥梁,解决基本类型不能作为对象使用的问题,是集合、泛型的前置知识,面试高频。
1. 8种基本类型与包装类 对应关系(必记,面试常考)
| 基本数据类型 | 包装类(引用类型) | 父类 | 关键备注 |
|---|---|---|---|
| byte | Byte | Number | 字节型,日常使用极少 |
| short | Short | Number | 短整型,日常使用极少 |
| int | Integer | Number | 整型,最常用,考点最多 |
| long | Long | Number | 长整型,需加 L(如 100L) |
| float | Float | Number | 单精度浮点型,需加 F(如 3.14F) |
| double | Double | Number | 双精度浮点型,日常最常用浮点型 |
| char | Character | Object | 唯一不继承 Number 的包装类 |
| boolean | Boolean | Object | 布尔型,parse 方法仅"true"转 true |
小技巧:除了 int→Integer、char→Character,其余包装类都是基本类型首字母大写。
2. 装箱与拆箱(核心考点)
(1)定义(必记)
- 装箱:基本数据类型 → 对应包装类(如 int → Integer);
- 拆箱:包装类 → 对应基本数据类型(如 Integer → int)。
(2)两种方式(必记)
| 方式 | 手动装箱/拆箱(JDK5 前) | 自动装箱/拆箱(JDK5 后,重点) |
|---|---|---|
| 装箱(基本→包装) | new Integer(123) / Integer.valueOf(123) | Integer i = 123;(底层调用 valueOf()) |
| 拆箱(包装→基本) | i.intValue() | int num = i;(底层调用 intValue()) |
(3)核心要点(必记)
- JDK5 后,基本类型和包装类可直接赋值、运算、比较(自动转换);
- 自动装箱/拆箱是 编译器优化,底层还是调用对应方法(不是 JVM 优化);
- 包装类可以为 null,基本类型不能为 null(日常开发注意空指针异常)。
3. Integer 常量池(面试高频考点,必记)
- 核心机制:Java 提前创建了 -128 ~ 127 之间的 Integer 对象,存入常量池;
- 复用规则:
- 用
valueOf()或自动装箱创建该区间内的对象,复用常量池对象(地址相同); - 用
new Integer()创建对象,无论值是否在区间内,都新建对象(地址不同); - 值超出 -128~127,无论用哪种方式,都新建对象(不复用)。
- 用
面试常考题示例(答案必记):
Integer i1 =127;Integer i2 =127;System.out.println(i1 == i2);// true(复用常量池)Integer i3 =128;Integer i4 =128;System.out.println(i3 == i4);// false(超出区间,新建对象)Integer i5 =newInteger(127);Integer i6 =newInteger(127);System.out.println(i5 == i6);// false(new 新建对象)4. 包装类 常用方法(必记,日常高频)
| 方法类型 | 核心方法 | 说明 |
|---|---|---|
| 类型转换(高频) | Integer.parseInt(String s) | 字符串 → int(最常用) |
Double.parseDouble(String s) | 字符串 → double | |
Boolean.parseBoolean(String s) | 字符串 → boolean(仅"true"转 true) | |
| 进制转换 | Integer.toBinaryString(int i) | int → 二进制字符串 |
Integer.toHexString(int i) | int → 十六进制字符串 | |
| 装箱方法 | Integer.valueOf(int i) | int → Integer(自动装箱底层) |
5. 包装类 易错点(必记)
- 除了 Character,其余 7 种包装类都有
parseXxx()方法(字符串转基本类型); - Character 没有 parseChar() 方法,字符串转 char 需用
str.charAt(0); parseXxx()方法的参数必须是符合对应类型的字符串(如 parseInt() 只能接收纯数字),否则抛NumberFormatException;- 包装类 == 比较地址,equals() 比较值(重写了 equals 方法);基本类型 == 比较值。
三、整体核心考点 + 面试高频提问(必背)📝
(一)时间类 面试高频
- JDK7 时间类的痛点是什么?(线程不安全、字段混乱、API 不直观);
- JDK8 时间类的优势是什么?(不可变、线程安全、API 直观、字段合理);
- SimpleDateFormat 为什么线程不安全?JDK8 用什么替代?(底层有共享变量,用 DateTimeFormatter 替代);
- LocalDateTime 和 Date 的区别?(不可变 vs 可变、线程安全 vs 不安全、API 直观 vs 不直观);
- 如何计算两个日期的间隔?(Period、Duration、ChronoUnit,说明各自适用场景)。
(二)包装类 面试高频
- 包装类的作用是什么?(让基本类型变成对象,适配集合、泛型);
- 自动装箱拆箱的原理是什么?(JDK5 编译器优化,底层调用 valueOf() 和 xxxValue() 方法);
- Integer 常量池的范围是什么?复用规则是什么?(-128~127,valueOf/自动装箱复用,new 不复用);
- int 和 Integer 的区别?(基本类型 vs 引用类型、不能为 null vs 可以为 null、== 比较值 vs 比较地址);
- String 转 int 用什么方法?(Integer.parseInt(String s));
- Boolean.parseBoolean(“abc”) 的结果是什么?(false,仅"true"转 true)。
📌 全篇核心总结(纯干货,必记)
- 时间类:日常开发优先用 JDK8 的 LocalDateTime、LocalDate、DateTimeFormatter,规避 JDK7 的线程安全和字段混乱问题;
- 包装类:记牢 8 种对应关系,掌握自动装箱拆箱原理、Integer 常量池,重点学会 parseXxx() 类型转换方法;
- 易错点:Calendar 月份/星期的起始值、Integer 常量池复用规则、包装类 null 空指针风险;
- 面试重点:JDK7/JDK8 时间类对比、自动装箱拆箱原理、Integer 常量池、常用方法。
✍️ 写在最后
本篇已将 Java 基础核心的 时间类(JDK7+JDK8)和包装类 全部重点干货汇总完毕,覆盖了日常开发高频用法和面试核心考点,建议收藏起来,复习、备查、应对面试都能用得上。
前三篇是详细讲解,本篇是重点提炼,两者结合,能彻底吃透这两个 Java 基础核心模块。后续我们将继续推进 Java 基础系列,学习字符串、集合框架等核心知识点,逐步搭建完整的 Java 知识体系,助力大家扎实掌握 Java 基础,从容应对开发和面试~
觉得干货实用,欢迎点赞 👍、收藏 💾、评论 💬,后续持续更新高质量 Java 基础干货总结,陪你一起夯实 Java 基础!