11、Java 基础硬核复习:常用类和基础API的核心逻辑与面试考点
一、核心知识体系:常用类的"三大模块"与"四大专题"
本章的知识围绕"字符串处理、日期时间、比较排序、其他常用类"展开,可以归纳为三大模块 (字符串、日期、比较器)和四大专题(String、日期类、比较器、其他常用类)。
1.1 字符串家族:不可变性与性能优化
String是Java中最常用的类之一,其核心特性是不可变性(Immutable),理解这一点对优化性能至关重要。
- 不可变性 :
String对象一旦创建,内容无法修改(如String s = "abc"; s = "def";实际是创建了新对象,原对象被GC回收)。 - 内存结构 :
String对象存储在堆内存 中,常量池(Constant Pool)用于存储字符串字面量(如"abc"),重复的字符串会复用常量池中的对象(节省内存)。 - 实例化方式 :
- 直接赋值:
String s = "abc";(从常量池获取,若不存在则创建); new关键字:String s = new String("abc");(无论常量池是否存在,都会创建新对象)。
- 直接赋值:
- 连接操作 :
+(底层用StringBuilder)、concat()(效率低,不推荐)、StringBuilder(线程不安全,效率高)的区别。
1.2 StringBuffer与StringBuilder:线程安全与性能权衡
StringBuffer和StringBuilder用于处理字符串拼接,区别在于线程安全:
- StringBuffer :线程安全(方法用
synchronized修饰),适用于多线程环境; - StringBuilder:线程不安全,效率更高(JDK 5.0引入,单线程推荐)。
- 常用方法 :
append()(追加)、insert()(插入)、delete()(删除)、reverse()(反转)等。
1.3 日期时间家族:从旧到新的演进
Java的日期时间类经历了从Date到Calendar再到Java8新API的演进,需掌握各类的使用场景:
- 旧一代(JDK 8之前) :
java.util.Date和java.sql.Date的转换;SimpleDateFormat:用于格式化和解析,但线程不安全;Calendar:日历类,用于日期计算(如"百天推算")。
- 新一代(JDK 8) :
LocalDate(日期)、LocalTime(时间)、LocalDateTime(日期时间):不可变、线程安全;DateTimeFormatter:替代SimpleDateFormat,线程安全。
1.4 比较器:自然排序与定制排序
比较器用于自定义类的排序,需掌握两者的区别:
- Comparable :自然排序,实现
compareTo()方法(如String、Integer已实现),适用于自定义类的默认排序(如商品按价格排序); - Comparator :定制排序,实现
compare()方法,适用于灵活排序(如商品按名称排序、按销量排序)。
1.5 其他重要工具类
System&Math:常用静态方法(如System.currentTimeMillis()获取时间戳,Math.random()生成随机数);BigInteger&BigDecimal:用于处理超大整数和高精度浮点数(金融领域必用,避免浮点数误差)。
二、高频面试考点:必考"死穴",掌握这些=掌握常用类核心
本章的面试题非常"高频",主要考察对"性能"和"安全"的权衡,以下是必考考点:
2.1 String、StringBuffer、StringBuilder的区别(必考 Top1)
- 考点:这三者有什么不同?什么时候用哪个?
- 答案 :
- 可变性 :
String不可变;StringBuffer和StringBuilder可变; - 线程安全 :
StringBuffer安全;StringBuilder不安全; - 性能 :
StringBuilder>StringBuffer>String; - 结论 :操作少量数据用
String;单线程大量数据操作用StringBuilder;多线程大量操作用StringBuffer。
- 可变性 :
2.2 String的不可变性(Immutability)
- 考点 :为什么
String被设计成不可变的? - 答案 :
- 字符串常量池的需要(节省内存);
- 线程安全(在多线程中可以放心共享);
- HashCode缓存 (适合做
HashMap的key)。
2.3 new String("abc")创建的对象数量
- 考点 :
new String("abc")创建了几个对象? - 答案 :两个 (假设常量池中还没有
"abc")。一个是在堆中的String对象,另一个是字符串常量池中的"abc"字节码常量。
2.4 Comparable vs Comparator
- 考点:两者的区别?
- 答案 :
Comparable是**"内部"**的(实现该接口意味着"我天生可以比较");Comparator是**"外部"**的(一种策略模式,意味着"我找了个第三方裁决者来比较")。
2.5 Java 8为什么要引入新的日期API?
- 考点 :旧的
Date/Calendar有什么问题? - 答案 :
- 线程不安全 :
SimpleDateFormat是线程不安全的,多线程下必须加锁或用ThreadLocal; - 设计混乱 :
Date既包含日期又包含时间,且月份从0开始(非常反直觉); - 可变性 :旧的
Date是可变的,Java 8的新类是不可变的,线程安全。
- 线程不安全 :
2.6 高精度计算问题
- 考点 :涉及钱的计算能用
double吗? - 答案 :不能 ,会有精度丢失。必须使用**
BigDecimal,且构造时必须传入String类型**(new BigDecimal("0.1"))。
三、学习建议:从"理论"到"实践"的跃迁
- 源码阅读 :有空看一眼
String类的源码,确认final关键字和char[]数组; - 实战 :把项目中所有的
SimpleDateFormat替换为DateTimeFormatter,体会新API的好用之处; - 多写代码:通过字符串反转、日期格式化、商品排序等案例,理解常用类的使用。
四、总结:常用类是"Java基础"的"基石"
第11章是"常用类和基础API"的硬核复习,它将你从"掌握语法"带入"高效使用基础类"的层面。掌握这些知识,你就能写出更高效的代码,也能在面试中轻松应对"Java基础"的"高频考点"。
记住,基础类是Java开发的"工具箱" ------熟练使用String、日期类、比较器,是成为优秀Java开发者的"基本功"。