Java 30 组技术知识点表格对比 1. ArrayList VS LinkedList表格对比维度ArrayListLinkedList底层结构动态数组连续内存双向链表离散节点随机下标查询O (1)速度极快O (n)需要遍历节点尾部新增元素无扩容时很快扩容需数组复制仅修改指针无数组拷贝头部 / 中间增删元素移位性能差仅修改前后指针速度快内存占用仅存储数据开销小每个节点存 prev、next 指针内存开销大遍历推荐方式普通 fori、foreach 均高效禁止 fori 遍历仅 foreach适用场景查询多、尾部新增频繁绝大多数业务频繁头尾插入删除、用作队列 / 栈2. HashMap VS ConcurrentHashMap(JDK8)表格对比维度HashMapConcurrentHashMap线程安全线程不安全并发会丢数据、死循环线程安全并发锁机制无锁CAS synchronized 锁住链表 / 红黑树头节点锁粒度细null 支持允许 1 个 null key多个 null valuekey、value 均不允许 null直接 NPE并发扩容并发扩容会出现链表循环死链分段迁移并发扩容安全底层结构数组 链表 红黑树数组 链表 红黑树适用场景单线程场景多线程并发读写缓存场景3. HashMap VS LinkedHashMap VS TreeMap表格对比维度HashMapLinkedHashMapTreeMap有序性完全无序插入有序 / 访问有序Key 自然升序排列底层结构哈希表哈希表 双向链表红黑树读写效率O (1)速度最快O (1)略慢于 HashMapO (logn)速度最慢排序规则无排序插入顺序 / 访问顺序实现 Comparable 或自定义比较器典型场景普通键值存储有序遍历、简易 LRU 缓存需要按 key 排序的场景4. ArrayList VS CopyOnWriteArrayList表格对比维度ArrayListCopyOnWriteArrayList线程安全不安全线程安全读取性能单线程读取极快无锁读取多线程读性能优秀写入性能轻量开销小写入复制完整数组开销巨大遍历并发修改遍历增删抛 ConcurrentModificationException迭代基于快照无并发修改异常适用场景单线程操作集合读多写少配置缓存、白名单5. synchronized VS ReentrantLock表格对比维度synchronizedReentrantLock底层实现JVM 底层内置自动释放AQS 同步队列API 手动控制公平锁仅非公平锁支持公平 / 非公平锁切换阻塞中断阻塞后不可中断lockInterruptibly () 支持中断等待限时等待不支持tryLock (时间)超时自动放弃竞争释放规则代码块执行完自动释放必须在 finally 手动 unlock否则死锁多条件等待仅 1 个 wait 等待队列支持多个 Condition 条件变量6. volatile VS synchronized表格对比维度volatilesynchronized可见性保证变量可见性保证可见性原子性不保证i 等复合操作不安全保证操作原子性指令重排禁止读写前后指令重排完全禁止临界区内指令重排锁机制无锁轻量级独占互斥锁存在线程上下文切换适用场景布尔状态标记、双重检查锁单例多线程复合操作、计数、数据修改7. Runnable VS Callable表格对比维度RunnableCallable方法返回值run () 无返回值call () 支持泛型返回值受检异常不可抛出只能内部捕获可抛出任意受检异常线程池返回结果submit 无返回对象submit 返回 Future可获取执行结果使用场景无需获取任务执行结果异步任务需要返回数据、捕获异常8. CountDownLatch VS CyclicBarrier表格对比维度CountDownLatchCyclicBarrier复用性一次性计数归零无法重置可循环复用等待完成自动重置等待逻辑一组子任务执行完主线程等待多个线程互相等待全部到达屏障再一起执行典型场景主线程等待批量查询、多接口汇总计算多线程分段计算全部完成后合并结果9. parallelStream VS CompletableFuture 自定义线程池表格对比维度parallelStreamCompletableFuture (自定义线程池)线程池来源全局共享 ForkJoinPool开发者自定义隔离线程池IO 阻塞影响IO 阻塞任务会拖垮全局所有并行流任务隔离互不影响其他业务线程数量控制固定等于 CPU 核心数无法自定义可自由设置核心、最大线程数适用场景纯内存、无 IO 大数据计算RPC、数据库、文件 IO 等阻塞异步任务10. Stream 中间操作 VS 终止操作表格对比维度中间操作 (filter/map/sorted)终止操作 (collect/forEach/count)执行时机惰性求值不会立刻执行立即触发整条流计算逻辑返回值类型返回全新 Stream 对象无 Stream 返回返回集合 / 数值 / Optional流消耗不消耗原始流一次性消费流流直接关闭不可复用代码生效条件必须搭配终止操作才会执行单独调用即可执行全部链路11. map() VS flatMap()表格对比维度mapflatMap转换规则一对一转换 T→RT→StreamR拆解嵌套集合嵌套集合处理生成 StreamListT无法扁平化拆解多层嵌套输出单层流典型场景实体简单字段映射ListList、多层集合扁平化处理12. Optional.orElse() VS orElseGet()表格对比维度orElse(T)orElseGet(Supplier)执行时机无论 Optional 是否为空参数一定执行仅对象为空时才执行传入方法参数类型直接传入对象常量无参函数动态生成对象性能表现耗时方法会产生无效开销无多余执行性能更优推荐场景常量默认值、简单字符串数据库查询、RPC 等耗时操作13. Optional.of() VS Optional.ofNullable()表格对比维度Optional.of()Optional.ofNullable()入参 null 处理传入 null 直接抛出空指针传入 null 返回 Optional.empty ()使用前提明确对象一定不为 null不确定对象是否为空通用场景14. String 拼接 VS StringBuilder VS StringBuffer表格对比维度字符串 StringBuilderStringBuffer线程安全单线程安全非线程安全synchronized 加锁线程安全循环性能大量循环生成大量中间字符串性能极差单线程高性能推荐首选加锁损耗性能偏低编译优化少量拼接编译期优化为 StringBuilder无优化原生高效拼接无优化适用场景少量固定字符串拼接单线程循环大量拼接极少多线程并发拼接字符串15. VS equals()表格对比维度equals()基本类型直接比较数值不可使用引用类型对比内存地址是否相同Object 原生同 String / 包装类重写对比内容自定义实体永远判断地址需手动重写 equalshashCode实现业务字段对比16. 基本数据类型 VS 包装类表格对比维度基本类型 (byte/int 等)包装类 (Integer/Long 等)存储位置虚拟机栈堆内存创建对象实例默认值有固定默认值 (int0)默认 null可赋值空空值支持不能赋值 null编译报错允许 null易触发空指针缓存机制无缓存-128~127 缓存池区间外 判断为 false开销无对象头内存占用极小存在对象头内存开销大17. final 修饰 变量 / 方法 / 类表格对比维度final 修饰变量final 修饰方法final 修饰类修改限制基本类型值不可变引用地址不可变内部属性可修改子类无法重写该方法禁止被继承所有方法隐式 final性能优化无优化消除动态绑定轻微优化无动态分派优化访问速度代表示例final int MAX 100工具类内部私有方法String、Integer18. 抽象类 abstract class VS JDK8 接口 Interface表格对比维度抽象类接口构造方法拥有构造方法供子类调用无构造方法不能实例化成员变量支持任意访问修饰符变量变量默认 public static final 常量继承实现单继承只能继承一个父类多实现可同时实现多个接口代码块支持静态代码块、实例代码块仅 JDK9 支持私有方法无实例代码块核心定位抽取子类公共状态与行为定义行为契约无业务状态19. 重载 Overload VS 重写 Override表格对比维度重载 Overload重写 Override所在类同一个类中父子继承类之间方法签名方法名相同参数列表不同方法名、参数、返回值完全一致返回值返回值类型无限制协变返回不能随意修改访问权限任意权限无限制子类权限不能比父类更严格受检异常无限制不能抛出比父类更宽泛的受检异常20. try-with-resources VS 手动 close ()表格对比维度try-with-resources手动 finally close关闭时机实现 AutoCloseable自动关闭资源必须手动在 finally 执行关闭异常处理关闭异常作为抑制异常保存堆栈关闭异常会覆盖业务异常代码简洁度代码精简无冗余释放逻辑大量冗余 finally 模板代码泄漏风险几乎无资源泄漏风险忘记 close 会造成文件句柄、连接泄漏21. Error VS Exception表格对比维度ErrorException异常层级Throwable 顶层分支Throwable 分支业务异常父类产生原因JVM 系统致命故障代码逻辑、外部资源业务问题处理策略无需捕获程序无法恢复可捕获、自定义兜底处理典型案例OOM 堆溢出、栈溢出 StackOverflow空指针、IO 异常、参数非法22. 受检异常 VS 运行时异常表格对比维度受检异常 (Exception)运行时异常 (RuntimeException)编译校验强制 try-catch 或 throws 声明编译无强制校验触发场景外部不可控资源文件、网络、数据库代码逻辑错误空指针、数组越界、参数错误处理思路预判外部故障提前捕获兜底修复代码逻辑提前增加参数校验23. JVM 栈 VS 堆 VS 元空间 Metaspace表格对比维度虚拟机栈堆元空间 Metaspace存储内容局部变量、栈帧、方法调用信息所有对象实例、数组类元信息、常量、注解内存来源JVM 虚拟机内存JVM 堆内存操作系统本地内存GC 回收方法执行完毕自动销毁无 GC全程 GC 管理回收类卸载才释放极少 GC溢出异常StackOverflowErrorOutOfMemoryError(Java heap space)Metaspace OOM24. GC 算法标记清除 / 复制 / 标记整理表格对比维度标记清除复制算法标记整理内存碎片产生大量不连续内存碎片无任何内存碎片无内存碎片对象规整排列内存开销仅标记清除开销小需要预留一半内存作为复制区移动存活对象开销大适用区域老年代 CMS 收集器新生代 Minor GC老年代 Serial Old、G125. 泛型通配符extends T VS ? super T表格对比维度? extends T上界? super T下界读取操作可以安全读取返回 T 类型读取只能返回 Object无法强转 T写入操作无法存入任意对象编译报错可以存入 T 及其子类对象设计原则PECS 生产者 ProducerPECS 消费者 Consumer使用场景读取数据集合 List? extends User写入数据集合 List? super User26. Iterator 迭代器 VS fori 普通循环表格对比维度Iterator 迭代遍历fori 下标循环集合增删安全迭代器 remove () 安全无并发修改异常循环内 add/remove 直接抛异常下标获取无法获取当前元素下标可自由获取下标支持随机访问适用容器所有 Collection 集合仅支持实现 RandomAccess 的集合 (ArrayList)27. Transactional public VS private 方法表格对比维度public 方法private 方法AOP 代理拦截CGLIB/JDK 动态代理可拦截代理无法访问私有方法拦截失效事务生效情况事务正常开启、提交、回滚注解完全失效无事务管理调用限制外部类可直接调用仅本类内部可调用28. new Thread 手动创建 VS 线程池 ThreadPoolExecutor表格对比维度new Thread()ThreadPoolExecutor 线程池线程复用一次性线程执行完销毁线程复用减少创建销毁开销并发管控无线程上限线程无限暴涨可控制核心线程、最大并发数任务策略无阻塞队列、拒绝策略支持阻塞队列、4 种拒绝策略生产规范禁止线上使用生产环境异步任务强制使用29. List.subList () VS new ArrayList(list) 拷贝表格对比维度subListnew ArrayList(原集合)数据关联原集合视图不产生新数据完整拷贝全新集合数据隔离互相影响修改分片 / 原集合双向同步影响两个集合完全独立互不干扰内存占用仅创建视图对象几乎无额外内存占用双倍内存存储两份数据clear 效果仅清空分片视图原集合数据不变新集合清空不影响原始集合30. stream () 串行流 VS parallelStream 并行流表格对比维度stream () 串行流parallelStream () 并行流执行线程单线程顺序执行全局 ForkJoinPool 多线程并发遍历顺序严格保证集合原有顺序无法保证元素处理、遍历顺序阻塞任务无全局线程池污染风险IO/RPC 阻塞会占用公共线程池数据量适配小数据、有序业务逻辑纯内存、无 IO、超大数据批量计算