Java核心类库需理解设计意图与适用边界:String不可变适合固定文本,StringBuilder单线程拼接首选,StringBuffer仅多线程共享场景;ArrayList适合末尾操作,LinkedList适用于头尾增删;HashSet需重写hashCode和equals,HashMap key宜用不可变类;java.time包中LocalDateTime用于本地业务时间,ZonedDateTime用于跨时区;Objects.equals和requireNonNull提升安全性,Arrays.asList返回固定长度List,Math.round不适用于金额计算。

Java核心类库不是“背下来就行”的知识点,而是每天写代码时真正要伸手去拿的工具。用对了,效率翻倍;用错了,bug难查、性能拉胯。关键不在数量,而在理解每个类的设计意图和适用边界。
字符串处理:String、StringBuilder、StringBuffer 怎么选
三者本质是同一问题的三种解法,区别全在“变与不变”“快与安全”之间:
- String:内容不可变,每次拼接都生成新对象。适合固定文本、配置项、少量操作。别用它循环拼接日志或SQL,内存暴涨。
- StringBuilder:可变、非线程安全、单线程下最快。日常拼接(如JSON组装、HTML生成)首选它。初始化时建议指定容量,避免多次扩容:new StringBuilder(256)。
- StringBuffer:可变、方法加synchronized,多线程共享拼接场景才用。但实际开发中,更推荐用局部StringBuilder + 显式同步,或改用并发容器,而非依赖它的锁粒度。
集合框架:List、Set、Map 的真实使用逻辑
别只记“ArrayList查得快、LinkedList删得快”,要看场景背后的代价:
- ArrayList:底层是数组,扩容机制是1.5倍增长。频繁add()到末尾没问题;但中间插入/删除需移动大量元素,慎用于高频变动的队列。
- LinkedList:适合频繁头尾增删(如实现栈、队列),但随机get(i)是O(n)——别把它当ArrayList用。
- HashSet:依赖hashCode+equals,存自定义对象前必须重写这两个方法,否则可能重复添加或查不到。
- HashMap:JDK8后链表转红黑树阈值是8,但前提是hash分布极差。真正要注意的是:key尽量用不可变类(如String、Integer),避免hash值变化导致数据丢失。
日期时间:java.time 包取代 Date 和 Calendar
旧Date类线程不安全、设计混乱,java.time 是JDK8起的正解:
立即学习“Java免费学习笔记(深入)”;
- LocalDateTime:无时区,适合记录系统内业务时间(如订单创建时间)。
- ZonedDateTime:带时区,跨地域系统必须用它(如航班起飞时间、全球活动开始时间)。
- DateTimeFormatter:格式化/解析必须用它,别再用SimpleDateFormat——后者非线程安全,且已过时。常用预设格式:DateTimeFormatter.ISO_LOCAL_DATE_TIME。
- 注意:LocalDateTime.now()取的是JVM默认时区的时间,若需UTC,应写LocalDateTime.now(ZoneOffset.UTC)。
工具类:Objects、Arrays、Math 这些“小而关键”的存在
它们不炫技,但天天用,写错一个就埋雷:
- Objects.equals(a, b):比a.equals(b)安全。前者自动判空,后者a为null时直接NPE。
- Objects.requireNonNull(obj, "msg"):参数校验首选,抛出的异常带清晰提示,比if (obj == null) throw new NullPointerException() 更规范。
- Arrays.asList():返回的是固定长度的List,不支持add/remove。如需可变集合,得套一层new ArrayList(...)。
- Math.round():返回long或int,注意入参是float/double。别用它处理金额——精度丢失风险大,该用BigDecimal。


















