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开发者的"基本功"。

相关推荐
全栈师2 小时前
java和C#的基本语法区别
java·开发语言·c#
小鸡吃米…2 小时前
机器学习 —— 数据缩放
人工智能·python·机器学习
JHC0000002 小时前
智能体造论子--简单封装大模型输出审核器
开发语言·python·机器学习
diediedei2 小时前
Python字典与集合:高效数据管理的艺术
jvm·数据库·python
【赫兹威客】浩哥2 小时前
可食用野生植物数据集构建与多版本YOLO模型训练实践
开发语言·人工智能·python
气可鼓不可泄2 小时前
将dmpython 封装在容器镜像里
数据库·python
m0_561359672 小时前
超越Python:下一步该学什么编程语言?
jvm·数据库·python
2301_810730102 小时前
python第三次作业
开发语言·python
小马爱打代码2 小时前
Spring AI 实战:Agent 基础搭建与核心能力解析
java·人工智能·spring