11、Java 基础硬核复习:常用类和基础API的核心逻辑与面试考点

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:线程安全与性能权衡

StringBufferStringBuilder用于处理字符串拼接,区别在于线程安全

  • StringBuffer :线程安全(方法用synchronized修饰),适用于多线程环境;
  • StringBuilder:线程不安全,效率更高(JDK 5.0引入,单线程推荐)。
  • 常用方法append()(追加)、insert()(插入)、delete()(删除)、reverse()(反转)等。

1.3 日期时间家族:从旧到新的演进

Java的日期时间类经历了从DateCalendar再到Java8新API的演进,需掌握各类的使用场景:

  • 旧一代(JDK 8之前)
    • java.util.Datejava.sql.Date的转换;
    • SimpleDateFormat:用于格式化和解析,但线程不安全
    • Calendar:日历类,用于日期计算(如"百天推算")。
  • 新一代(JDK 8)
    • LocalDate(日期)、LocalTime(时间)、LocalDateTime(日期时间):不可变、线程安全;
    • DateTimeFormatter:替代SimpleDateFormat,线程安全。

1.4 比较器:自然排序与定制排序

比较器用于自定义类的排序,需掌握两者的区别:

  • Comparable :自然排序,实现compareTo()方法(如StringInteger已实现),适用于自定义类的默认排序(如商品按价格排序);
  • Comparator :定制排序,实现compare()方法,适用于灵活排序(如商品按名称排序、按销量排序)。

1.5 其他重要工具类

  • System & Math :常用静态方法(如System.currentTimeMillis()获取时间戳,Math.random()生成随机数);
  • BigInteger & BigDecimal:用于处理超大整数和高精度浮点数(金融领域必用,避免浮点数误差)。

二、高频面试考点:必考"死穴",掌握这些=掌握常用类核心

本章的面试题非常"高频",主要考察对"性能"和"安全"的权衡,以下是必考考点

2.1 String、StringBuffer、StringBuilder的区别(必考 Top1)

  • 考点:这三者有什么不同?什么时候用哪个?
  • 答案
    • 可变性String不可变;StringBufferStringBuilder可变;
    • 线程安全StringBuffer安全;StringBuilder不安全;
    • 性能StringBuilder > StringBuffer > String
    • 结论 :操作少量数据用String;单线程大量数据操作用StringBuilder;多线程大量操作用StringBuffer

2.2 String的不可变性(Immutability)

  • 考点 :为什么String被设计成不可变的?
  • 答案
    1. 字符串常量池的需要(节省内存);
    2. 线程安全(在多线程中可以放心共享);
    3. 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有什么问题?
  • 答案
    1. 线程不安全SimpleDateFormat是线程不安全的,多线程下必须加锁或用ThreadLocal
    2. 设计混乱Date既包含日期又包含时间,且月份从0开始(非常反直觉);
    3. 可变性 :旧的Date是可变的,Java 8的新类是不可变的,线程安全。

2.6 高精度计算问题

  • 考点 :涉及钱的计算能用double吗?
  • 答案不能 ,会有精度丢失。必须使用**BigDecimal,且构造时必须传入 String类型**(new BigDecimal("0.1"))。

三、学习建议:从"理论"到"实践"的跃迁

  1. 源码阅读 :有空看一眼String类的源码,确认final关键字和char[]数组;
  2. 实战 :把项目中所有的SimpleDateFormat替换为DateTimeFormatter,体会新API的好用之处;
  3. 多写代码:通过字符串反转、日期格式化、商品排序等案例,理解常用类的使用。

四、总结:常用类是"Java基础"的"基石"

第11章是"常用类和基础API"的硬核复习,它将你从"掌握语法"带入"高效使用基础类"的层面。掌握这些知识,你就能写出更高效的代码,也能在面试中轻松应对"Java基础"的"高频考点"。

记住,基础类是Java开发的"工具箱" ------熟练使用String、日期类、比较器,是成为优秀Java开发者的"基本功"。

相关推荐
小陳参上43 分钟前
用Python创建一个Discord聊天机器人
jvm·数据库·python
曹牧1 小时前
BeanUtils.copyProperties‌
java
QWQ___qwq2 小时前
Java线程安全深度总结:基本类型与引用类型的本质区别
java·安全·面试
识君啊2 小时前
Java异常处理:中小厂面试通关指南
java·开发语言·面试·异常处理·exception·中小厂
minstbe3 小时前
IC设计私有化AI助手实战:基于Docker+OpenCode+Ollama的数字前端综合增强方案(进阶版)
人工智能·python·语言模型·llama
zyq99101_14 小时前
优化二分查找:前缀和降复杂度
数据结构·python·蓝桥杯
qyzm4 小时前
天梯赛练习(3月13日)
开发语言·数据结构·python·算法·贪心算法
月月玩代码4 小时前
Actuator,Spring Boot应用监控与管理端点!
java·spring boot·后端
阿珍爱上了阿强,在一个有星星的夜晚5 小时前
node后端页面性能监测分析
java·学习方法
Java程序之猿5 小时前
SpringBoot + camel+IBM MQ实现消息队列处理
java·spring boot·mybatis