)
一、老祖宗Object所有类的爸爸作用提供所有对象的基础行为。方法作用使用频率重写注意toString()返回对象的字符串表示⭐⭐⭐⭐⭐日志、打印建议重写返回对象的业务字段equals(Object obj)判断逻辑相等⭐⭐⭐⭐⭐业务比较必须重写同时重写hashCodehashCode()返回哈希码用于散列集合⭐⭐⭐⭐⭐HashMap/HashSet必须重写保证与equals一致wait()/notify()/notifyAll()线程间通信等待/唤醒⭐⭐⭐多线程必须在synchronized块中调用getClass()获取运行时类的 Class 对象⭐⭐⭐反射无需重写反射获取信息面试高频equals和hashCode的契约——如果a.equals(b)为 true则a.hashCode() b.hashCode()必须成立。否则HashMap、HashSet等散列集合会出大问题。二、绝对的王者String不可变字符序列特点不可变线程安全。方法极多下面是必须掌握的。方法作用示例length()返回长度字符个数abc.length()→ 3charAt(int index)获取指定索引的字符abc.charAt(1)→ btoCharArray()/getBytes()转为字符数组 / 字节数组文件读写、加密常用equals(Object anObject)判断内容是否相等区分大小写a.equals(A)→ falseequalsIgnoreCase()忽略大小写比较a.equalsIgnoreCase(A)→ trueindexOf(String str)返回子串首次出现的索引hello.indexOf(l)→ 2lastIndexOf()返回子串最后出现的索引hello.lastIndexOf(l)→ 3substring(int begin)/substring(int begin, int end)截取字符串hello.substring(1)→ ellosplit(String regex)按正则分割注意转义.和|a,b.split(,)→ [a,b]trim()/strip()Java 11去除首尾空格strip 支持 Unicode a .trim()→ aisEmpty()/isBlank()Java 11判断是否为空或空白 .isBlank()→ truereplace()/replaceAll()替换字符/正则替换a.replace(a,b)toLowerCase()/toUpperCase()转大小写A.toLowerCase()→ ajoin(CharSequence delimiter, ...)静态拼接字符串String.join(-, a,b)→ a-bintern()手动将字符串放入常量池性能优化慎用容易踩坑⚠️面试坑substring在 JDK 6 中可能会内存泄漏持有原字符串引用JDK 7 已修复。记忆口诀“长度索引和截取分割替换去空格判等大小写转拼接 intern 要慎酌。”三、可变字符串StringBuilder/StringBuffer区别StringBuilder线程不安全但快单线程首选StringBuffer线程安全但慢已不推荐。方法作用关键点append(Object obj)追加任意类型数据链式调用return thisinsert(int offset, Object obj)在指定位置插入较少用delete(int start, int end)删除区间字符较少用reverse()反转字符串判断回文时好用toString()最终生成 String 对象循环拼接中必须最后调用capacity()获取当前容量源码分析扩容时用口诀“循环拼接用 Builder单行加号编译器帮Buffer 虽老已退场面试一问别慌忙。”四、集合框架超高频4.1List接口ArrayList/LinkedList特点有序、可重复。方法作用备注add(E e)/add(int index, E e)添加元素ArrayList 尾部添加快中间插入慢get(int index)随机访问O(1)ArrayList 专属优势remove(int index)/remove(Object o)删除注意按索引删除 vs 按对象删除删 int 需强转set(int index, E e)修改指定位置元素—size()/isEmpty()长度 / 判空判空用isEmpty()而非size() 0contains(Object o)/indexOf(Object o)是否包含 / 查找索引底层调用equalstoArray(T[] a)转为数组常用于传参或流操作forEach(Consumer action)默认遍历Java 8 后写法list.forEach(System.out::println)subList(int from, int to)截取子列表视图非复制修改子列表会反应到原列表注意并发修改4.2Map接口HashMap/ConcurrentHashMap特点键值对存储Key 不重复。方法作用高频场景put(K key, V value)存入键值对✅ 最常用get(Object key)根据 Key 取值不存在返回 null✅ 最常用getOrDefault(Object key, V defaultValue)取值若不存在返回默认值✅ 统计计数map.getOrDefault(a, 0) 1remove(Object key)根据 Key 删除—containsKey(Object key)判断 Key 是否存在✅ 业务校验keySet()/values()/entrySet()获取所有 Key/Value/Entry 集合✅遍历必用尤其entrySetputIfAbsent(K key, V value)如果 Key 不存在才插入原子性操作并发常用computeIfAbsent(K key, Function mapping)如果 Key 不存在则计算 Value 并插入✅缓存穿透防击穿神器merge(K key, V value, BiFunction)合并操作如累加✅map.merge(a, 1, Integer::sum)遍历 Map 的正确姿势java// ✅ 推荐使用 entrySet for (Map.EntryString, Integer entry : map.entrySet()) { System.out.println(entry.getKey() entry.getValue()); } // ✅ Java 8 风格 map.forEach((k, v) - System.out.println(k v)); // ❌ 不推荐先 keySet 再 get两次查找效率低 for (String key : map.keySet()) { System.out.println(key map.get(key)); }4.3 工具类Collections方法作用Collections.sort(ListT)排序需实现 ComparableCollections.reverse(ListT)反转Collections.synchronizedList/Map将集合转为线程安全的不推荐性能差Collections.unmodifiableList转为只读集合防御性编程口诀“List 有序可重复get/set/add/removeMap 存键值对entrySet 遍历最对computeIfAbsent 防击穿merge 累加一键完。”五、多线程与并发ThreadTimeUnit方法所在类作用关键细节start()Thread启动新线程调用run是普通方法调用不开启线程run()Thread/Runnable线程执行体实现业务逻辑join()Thread等待该线程死亡主线程等待子线程完事sleep(long millis)Thread静态当前线程休眠不释放锁抛出InterruptedExceptioninterrupt()Thread中断线程设置标志位阻塞时抛出异常需breakisInterrupted()Thread判断中断标志不清除—currentThread()Thread静态获取当前线程引用打日志常用yield()Thread静态主动让出 CPU礼让不常用依赖操作系统调度sleep(Duration)TimeUnit枚举高可读性休眠TimeUnit.SECONDS.sleep(5)✅口诀“start 开线程run 写业务join 等结束sleep 要关注interrupt 发信号currentThread 拿引用。”六、文件与 I/O 流6.1File操作文件/目录元信息方法作用exists()判断文件是否存在isFile()/isDirectory()判断类型mkdirs()创建多层目录推荐createNewFile()创建空文件原子性delete()/deleteOnExit()删除 / 程序退出时删除listFiles()遍历目录递归扫描的起点getName()/getAbsolutePath()获取文件名/绝对路径6.2InputStream/OutputStream字节流方法作用注意read()读 1 个字节返回 int读到末尾返回 -1read(byte[] b)批量读取推荐返回实际读到的字节数write(byte[] b, int off, int len)写入字节数组片段—close()释放资源必须在 finally 或 try-with-resources 中关闭flush()刷出缓冲区OutputStream写数据后必须调否则数据可能未落地6.3Reader/Writer字符流方法作用常用包装类read()/read(char[] cbuf)读字符—write(String str)写字符串—new InputStreamReader(InputStream, Charset)字节转字符指定编码防止中文乱码PrintWriter.println()自动换行打印最常用的输出写法Scanner.hasNext()/next()/nextLine()读取文本/控制台输入方便解析文件或键盘输入标准文件拷贝模板javatry (InputStream is new FileInputStream(src.txt); OutputStream os new FileOutputStream(dest.txt)) { byte[] buffer new byte[1024]; int len; while ((len is.read(buffer)) ! -1) { os.write(buffer, 0, len); } os.flush(); } catch (IOException e) { e.printStackTrace(); }七、JUC 并发工具类进阶必备类核心方法作用ReentrantLocklock()/unlock()/tryLock(timeout)手动加锁解锁必须 try-finally 释放Semaphoreacquire()/release()控制并发数限流CountDownLatchawait()/countDown()等待多个线程完成任务CyclicBarrierawait()多线程互相等待到达屏障AtomicIntegerincrementAndGet()/compareAndSet()无锁 CAS 自增性能优于 synchronizedConcurrentHashMap同Map接口但支持并发遍历put/get无锁或细粒度锁ExecutorsnewFixedThreadPool(n)/newCachedThreadPool()快速创建线程池阿里规范禁止使用需手写八、常用工具类速查ObjectsArraysObjectsNPE 克星方法作用Objects.equals(a, b)安全比较避免 a 为 null 抛异常Objects.toString(obj)安全转字符串null 返回 nullObjects.requireNonNull(obj)判空为空抛异常结合构造器用Arrays方法作用Arrays.toString(arr)打印一维数组内容不是地址Arrays.deepToString(arr2D)打印多维数组Arrays.sort(arr)排序快排/Dual-PivotArrays.asList(T... a)数组转 List返回的是固定长度视图不能 add/removeArrays.copyOf(arr, newLength)数组拷贝自动扩容/缩容 记忆总结核心中的核心场景推荐写法避坑提示判空Objects.equals(a, b)不用a.equals(b)避免 NPE集合判空list.isEmpty()不用list.size() 0语义更清晰String 拼接循环用StringBuilder单行用编译器会优化单行为StringBuilder但循环不会Map 取值getOrDefault或computeIfAbsent避免if (map.get(key) null)的重复查找流关闭try-with-resources自动调用close()不用手写 finally线程启动start()run()只是普通方法调用线程休眠TimeUnit.SECONDS.sleep(5)比Thread.sleep(5000)可读性更高数组打印Arrays.toString(arr)直接System.out.println(arr)打印的是地址如果你觉得computeIfAbsent和merge还比较陌生它们是解决缓存穿透和分组统计的神器。需要我专门写一篇代码示例帮你在项目中练手吗