news 2026/7/16 18:47:41

《Java 100 天进阶之路》第31.1篇:Java常用API与底层原理对比集(2026版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《Java 100 天进阶之路》第31.1篇:Java常用API与底层原理对比集(2026版)

第31.1篇:Java常用API与底层原理对比集(2026版)

📌系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第31篇:Java数组详解 |
➡️ 下一篇:第32篇:Java常用工具类

🗺️ 本文阅读地图(2 分钟速览)

常用 API 是开发中的“日常工具”,也是面试中容易忽视的考点。本文汇总 10 组高频易混淆概念,每组配一句话总结 + 详细对比:

编号对比组一句话区分
1String vs StringBuilder vs StringBufferString 不可变,Builder 快(线程不安全),Buffer 慢(线程安全)
2字符串常量池 vs 堆字面量在池中复用,new String()在堆中新建
3wait()vssleep()wait 释放锁需 notify,sleep 不释放锁时间到自醒
4notify()vsnotifyAll()唤醒一个 vs 唤醒全部
5EnumMapvsHashMapEnumMap 专为枚举设计,效率更高
6DatevsLocalDateDate 旧(可变/线程不安全),LocalDate 新(不可变/线程安全)
7SimpleDateFormat线程安全问题内部有 Calendar 共享状态,多线程需注意
8直接缓冲区 vs 堆缓冲区直接缓冲区减少拷贝(适合网络),堆缓冲区受 GC 管理
9flip()vsrewind()vsclear()flip 写→读,rewind 重读,clear 重置
10枚举 vs 普通常量类枚举类型安全,支持方法、单例

文章目录

    • 第31.1篇:Java常用API与底层原理对比集(2026版)
      • 🗺️ 本文阅读地图(2 分钟速览)
      • 一、核心知识点概览
      • 二、逐组对比详解
        • 对比1:String vs StringBuilder vs StringBuffer
        • 对比2:字符串常量池 vs 堆
        • 对比3:`wait()` vs `sleep()`
        • 对比4:`notify()` vs `notifyAll()`
        • 对比5:`EnumMap` vs `HashMap`
        • 对比6:`Date` vs `LocalDate`
        • 对比7:`SimpleDateFormat` 线程安全问题
        • 对比8:直接缓冲区 vs 堆缓冲区
        • 对比9:`flip()` vs `rewind()` vs `clear()`
        • 对比10:枚举 vs 普通常量类
      • 三、避坑要点
      • 四、练习题
    • 📊 你的学习进度
    • 👉 下一篇文章预告

一、核心知识点概览

本篇文章涵盖 Java 常用 API 与底层原理中 10 组最高频的易混淆概念,来源于第21~31篇的全部内容:

篇号涉及对比数量
第21篇Object 方法(扩展)
第22篇String vs StringBuilder vs StringBuffer、常量池2组
第23篇直接缓冲区 vs 堆缓冲区、flip/rewind/clear2组
第24篇枚举 vs 常量类、EnumMap vs HashMap2组
第26篇注解(扩展)
第27篇代理(扩展)
第28篇反射(扩展)
第29-30篇Date vs LocalDate、SimpleDateFormat 线程安全2组
第31篇数组(扩展)

二、逐组对比详解

对比1:String vs StringBuilder vs StringBuffer
对比维度StringStringBuilderStringBuffer
可变性❌ 不可变✅ 可变✅ 可变
线程安全✅ 安全(不可变)不安全安全(synchronized)
性能拼接时低最高较低(同步开销)
适用场景少量拼接/不可变单线程、频繁拼接多线程、频繁拼接
引入版本Java 1.0Java 5Java 1.0

💡 一句话总结:String 不可变(安全但拼接慢),StringBuilder 单线程神器,StringBuffer 多线程安全但慢。

对比2:字符串常量池 vs 堆
对比维度字符串常量池
存储位置方法区(元空间)
存储内容字面量字符串(复用)new String()创建的对象
是否复用✅ 相同字符串共用一份❌ 每次new创建新对象
垃圾回收可回收但频率低正常 GC 回收

代码验证

Strings1="hello";// 常量池Strings2="hello";// 复用池中对象Strings3=newString("hello");// 堆中新建System.out.println(s1==s2);// trueSystem.out.println(s1==s3);// false
对比3:wait()vssleep()
对比维度wait()sleep()
所属类Object 实例方法Thread 静态方法
是否释放锁释放不释放
唤醒方式notify()/notifyAll()时间到自动醒来
使用位置必须在synchronized任何地方
线程状态WAITINGTIMED_WAITING
对比4:notify()vsnotifyAll()
对比维度notify()notifyAll()
唤醒数量唤醒一个等待线程唤醒所有等待线程
选择哪个线程JVM 随机选择全部唤醒
适用场景一个生产者一个消费者多个生产者/消费者
对比5:EnumMapvsHashMap
对比维度EnumMapHashMap
键类型只能是枚举类型任意类型
底层实现数组(枚举常量索引)数组+链表+红黑树
性能更高(直接数组访问)较低(哈希计算)
null 键❌ 不允许✅ 允许
适用场景键是枚举类型时优先使用通用 Map
对比6:DatevsLocalDate
对比维度java.util.Datejava.time.LocalDate
可变性❌ 可变不可变
线程安全❌ 不安全安全
月份起始从 0 开始(1月=0)从 1 开始(1月=1)
年份从 1900 开始正常年份
是否推荐❌ 推荐使用推荐(Java 8+)
对比7:SimpleDateFormat线程安全问题

问题根源SimpleDateFormat内部维护一个Calendar对象引用,多线程共享时,一个线程修改 Calendar 状态会影响其他线程,导致解析错误或异常。

解决方案

  • 方案一:每次使用时创建新实例(最简单)
  • 方案二:使用ThreadLocal包装
  • 方案三:使用DateTimeFormatter(Java 8+,线程安全)
对比8:直接缓冲区 vs 堆缓冲区
对比维度直接缓冲区堆缓冲区
内存位置系统本机内存(Native)JVM 堆内存
GC 管理❌ 不受 GC 管理✅ 受 GC 管理
数据拷贝次数1 次(少一次拷贝)2 次(堆→Native 再传输)
分配速度慢(系统调用)
适用场景大文件、网络 I/O小数据、通用场景
对比9:flip()vsrewind()vsclear()
方法作用positionlimit
flip()写→读模式切换0原 position
rewind()重新读(不改变 limit)0不变
clear()重置(准备写)0capacity
对比10:枚举 vs 普通常量类
对比维度枚举(enum)普通常量类
类型安全✅ 编译期检查❌ 可能传入非法值
方法✅ 可以有方法❌ 只有常量
单例✅ 天然单例❌ 需手动实现
反射攻击✅ 防止❌ 可反射修改

三、避坑要点

错误/误区后果正确做法
循环中用+拼接字符串性能极差StringBuilder
==比较字符串内容可能 falseequals()
多线程共享SimpleDateFormat解析错误/异常ThreadLocalDateTimeFormatter
使用Date的废弃构造方法代码不可靠LocalDate
忘记flip()直接读 Buffer读不到数据写后读前flip()

四、练习题

  1. 代码题String s1 = "abc"; String s2 = new String("abc");s1 == s2的结果是什么?为什么?

  2. 改错题:下面的代码有什么问题?如何修复?

    SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");// 多个线程共享 sdf
  3. 选择题:ByteBuffer 写数据后要切换到读模式,应该调用哪个方法?
    A.clear()B.rewind()C.flip()D.reset()


📊 你的学习进度

  • 当前:第31.1篇 ·基础篇外挂:常用API与底层原理对比集
  • ✅ 已完成:基础篇第1~31篇 + 第4.1篇 + 第20.1~20.2篇 + 第31.1篇
  • 📖 正在学:第31.1篇
  • ⏳ 待学习:第32~44篇(主体)+ 更多外挂篇

👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇

👉 下一篇文章预告

🚀下一篇:《第32篇:Java常用工具类》

内容简介:Objects、Collections、Arrays 工具类使用与对比。

📌《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 18:47:39

CANN Ascend C SIMD掩码更新函数

asc_update_mask 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcod…

作者头像 李华
网站建设 2026/7/16 18:46:46

MPL_ROS与ROS 2迁移指南:从ROS Kinetic到ROS 2 Foxy的完整迁移方案

MPL_ROS与ROS 2迁移指南:从ROS Kinetic到ROS 2 Foxy的完整迁移方案 【免费下载链接】mpl_ros A ROS wrapper for trajectory planning based on motion primitives 项目地址: https://gitcode.com/gh_mirrors/mp/mpl_ros 欢迎来到MPL_ROS(Motion …

作者头像 李华
网站建设 2026/7/16 18:42:55

DNABERT-2全面升级:多物种基因组模型如何提升预测性能?

DNABERT-2全面升级:多物种基因组模型如何提升预测性能? 【免费下载链接】DNABERT DNABERT: pre-trained Bidirectional Encoder Representations from Transformers model for DNA-language in genome 项目地址: https://gitcode.com/gh_mirrors/dn/DN…

作者头像 李华
网站建设 2026/7/16 18:42:37

jspm美食推荐系统

文章目录 目录 文章目录 论文目录 项目介绍 开发环境 系统实现 论文参考 论文目录 第1章 概 述 1.1 开发背景及研究意义 1.2 国内外研究现状和发展趋势 1.3 本文主要研究的内容 第2章 关键技术介绍 2.1 开发环境 2.2 JSP技术介绍 2.3 MySQL数据库 …

作者头像 李华
网站建设 2026/7/16 18:42:31

校园一卡通密钥管理系统

文章目录 目录 文章目录 论文目录 项目介绍 开发环境 系统实现 论文参考 论文目录 第1章 绪论 1.1选题动因 1.2目的和意义 1.3论文结构安排 第2章 开发环境与技术 2.1 MYSQL数据库 2.2 Tomcat 介绍 2.3 vue技术 2.4 SSM框架 第3章 系统分析 3.1可行…

作者头像 李华
网站建设 2026/7/16 18:42:13

智能卤菜销售平台

文章目录 目录 文章目录 论文目录 项目介绍 开发环境 系统实现 论文参考 论文目录 第一章 绪论 1.1 研究背景 1.2 课题研究的内容 1.4 系统实现的特点 1.5 本文的组织结构 第二章开发技术与环境配置 2.1 SSM框架 2.2 Java语言简介 2.3 MySQL环境…

作者头像 李华