当前位置: 首页 > news >正文

《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!
👉 点击关注我,更新后第一时间收到推送!

http://www.cnnetsun.cn/news/3434168.html

相关文章:

  • CANN Ascend C SIMD掩码更新函数
  • MPL_ROS与ROS 2迁移指南:从ROS Kinetic到ROS 2 Foxy的完整迁移方案
  • DNABERT-2全面升级:多物种基因组模型如何提升预测性能?
  • jspm美食推荐系统
  • 校园一卡通密钥管理系统
  • 智能卤菜销售平台
  • 企业级即时通讯:以IM为中心重塑业务协同体验
  • GPT-5.6 重构 20 万行遗留代码实践:开发提效 82% 的完整复盘与经验总结
  • Vibe语音转文字:新手也能轻松上手的免费转录工具终极指南
  • 独立站建设与外贸GEO:乐云SEO探索海外流量新路径
  • Home Assistant Floor Plan Generator性能优化:缓存机制与渲染效率提升方法
  • 界面组件Kendo UI for Angular教程 - 构建强大的PDF阅读器(二)
  • 「Qt Widget中文示例指南」如何实现一个简单的RHI小部件示例(一)
  • 如何提升Jenkins构建效率?Build Monitor Plugin核心功能全解析 [特殊字符]
  • Rainbow-delimiters与其他Emacs括号插件的对比分析
  • AI批量写代码后期摆烂?底层原理和落地对策讲透了 ​
  • 解锁Microsoft 365完整功能:Ohook钩子技术的三个关键突破
  • 终极Mac鼠标滚动优化指南:让外接鼠标如丝般顺滑的完整教程
  • 墨西哥各类自然资源与支柱产业完整梳理
  • 如何快速上手Optuna Dashboard?5分钟搭建你的优化监控平台
  • 3分钟上手Reactive Resume:免费开源简历构建器终极指南
  • Loop macOS窗口管理工具:用优雅的径向菜单重新定义工作效率
  • 告别数据混乱:bytebuffer.js的Base64、UTF8与Hex编码转换实战技巧
  • AltoClef:终极Minecraft自动化机器人 - 第一个完全自主通关的AI助手
  • Invoke-WCMDump源码深度剖析:从C到PowerShell的完整实现
  • 为什么选择Vegas?对比Scala生态中的5个数据可视化库
  • 如何自定义Color-Hash:色调、饱和度、亮度的完全控制指南
  • PyCharm中配置qtDesigner
  • CCD二段除铁铝----添加黄钠铁矾晶种(NaFe₃(SO₄)₂(OH)₆),优先吸附Fe³⁺
  • 低代码平台简介:JeecgBoot、AppSmith、ToolJet、Refine、Budibase、Kestra、Node-RED、amis、APIJSON