Java 核心知识与技术全景解析

简介: 本文涵盖 Java 多方面核心知识,包括基础语法中重载与重写、== 与 equals 的区别,String 等类的特性及异常体系;集合类中常见数据结构、各集合实现类的特点,以及 HashMap 的底层结构和扩容机制;网络编程中 BIO、NIO、AIO 的差异;IO 流的分类及用途。线程与并发部分详解了 ThreadLocal、悲观锁与乐观锁、synchronized 的原理及锁升级、线程池核心参数;JVM 部分涉及堆内存结构、垃圾回收算法及伊甸园等区域的细节;还包括 Lambda 表达式、反射与泛型的概念,以及 Tomcat 的优化配置。内容全面覆盖 Java 开发中的关键技术点,适用于深

一、基础语法与面向对象

  1. 重载与重写的区别:重载是同一对象中方法名相同但参数列表不同的方法,编译时由编译器根据参数区分;重写是父子类(或接口与实现类)中方法名和参数列表都相同的方法,运行时由虚拟机根据对象实际类型确定调用哪个,可用@Override检查是否重写。
  2. == 与 equals 的区别:对于基本类型,==比较值;对于引用类型,==比较引用地址(是否为同一对象)。equals 的实现不同:Object 的 equals 本质是==,而 String、ArrayList 等的 equals 比较内容(如字符串的每个字符、集合的每个元素)。
  3. String、StringBuilder 和 StringBuffer 的区别:三者都可表示字符串,String 不可变(线程安全),后两者可变;StringBuilder 非线程安全,StringBuffer 线程安全(方法加同步锁)。大部分场景用 String;大量拼接时,多线程访问用 StringBuffer,单线程内用 StringBuilder 更高效。String 被 final 修饰是为了保证不可变,带来线程安全、可缓存等好处。
  4. Java 中的异常:Throwable 是顶层父类,分为 Error 和 Exception。Error 是无法恢复的错误(如内存溢出、栈溢出),捕获后通常无法恢复;Exception 是可恢复的异常,可通过 catch 处理或 throw 抛给上层。Exception 分检查异常(必须处理,如 try-catch 或 throws)和非检查异常(RuntimeException 及其子类,如空指针、数组越界,无需强制处理)。

二、集合类

  1. 常见数据结构:线性结构有动态数组(如 ArrayList,元素连续存储)、链表(如 LinkedList,元素通过节点链接)、栈(先进后出,LinkedList 的 push/pop/peek 可实现)、队列(先进先出,LinkedList 的 offer/poll 可实现);非线性结构有优先级队列(如 PriorityQueue,基于堆实现,适合排行榜)、哈希表(如 HashMap,key-value 存储,快速查找)、红黑树(如 TreeMap,自平衡二叉树)、跳表(如 ConcurrentSkipListMap,多级链表,性能接近红黑树)、B + 树(数据库索引常用)。
  2. Java 常见集合类:核心接口有 Collection(子接口 List、Set)和 Map。List 实现类中,ArrayList 基于数组,随机访问快、增删(非尾部)影响其他元素;LinkedList 基于链表,随机访问慢、增删(非定位阶段)快;Vector 基于数组,线程安全。Set 实现类中,HashSet 基于 HashMap,元素唯一(需实现 hashCode 和 equals)。Map 实现类中,HashMap 底层是数组 + 链表 + 红黑树,key 唯一;LinkedHashMap 在 HashMap 基础上用链表记录插入顺序(可做 LRU 缓存);TreeMap 基于红黑树;Hashtable 线程安全(方法加 synchronized);ConcurrentHashMap 线程安全(锁链表,并发度高,get 无锁靠 volatile 保证可见性)。
  3. HashMap 原理(数据结构):底层是数组 + 链表 + 红黑树。数组通过 key 的 hashCode 计算索引,实现 O (1) 存取;因数组容量有限,会发生哈希冲突,用链表存储冲突元素(此时存取复杂度 O (n));当链表长度≥8 且数组容量≥64 时,链表转为红黑树(复杂度 O (log n)),节点减少到一定程度会退化为链表。
  4. HashMap 原理(扩容):扩容因子 0.75,初始容量 16,当元素数超过容量 ×0.75 时扩容(容量翻倍)。扩容后重新计算 key 的索引,部分 key 会移动到新位置(通过 (n-1)&hash 计算,n 为新容量)。

三、网络编程

BIO、NIO、AIO 的区别:三者核心差异在处理客户端连接、数据等待、数据复制阶段的线程状态。BIO 中线程在这三个阶段都阻塞,高并发下线程资源紧张;NIO 在连接和数据等待阶段非阻塞,结合多路复用技术(事件驱动),用少量线程处理大量请求,线程利用率高;AIO 在数据复制阶段也解放线程,通过回调处理,适合高并发场景。

四、IO 流

IO 流按单位分字节流(父类 InputStream、OutputStream)和字符流(父类 Reader、Writer)。转换流(InputStreamReader、OutputStreamWriter)用于字节流转字符流;缓冲流(如 BufferedInputStream)通过缓冲提高效率;对象流(ObjectInputStream、ObjectOutputStream)配合序列化实现对象与字节流的转换。

五、线程与并发

  1. ThreadLocal 原理:用于多线程变量隔离,每个线程有 ThreadLocalMap,以 ThreadLocal 为 key 存储隔离资源。set 方法将资源存入当前线程的 map,get 方法从中获取,用完需调用 remove () 避免内存泄漏。
  2. 悲观锁与乐观锁:悲观锁(如 synchronized、Lock)认为会有竞争,失败线程阻塞,适合竞争多、独占时间长的场景;乐观锁(如 AtomicInteger)认为竞争少,失败线程重试,适合竞争少、快速处理的场景。
  3. synchronized 原理:重量级锁中,线程通过 Monitor 对象的 owner 属性竞争,成功则加锁,失败则自旋重试或进入等待队列。锁升级过程:单线程加锁用偏向锁,交替加锁用轻量级锁,竞争时升级为重量级锁(Java 15 后偏向锁废弃)。
  4. synchronized 和 volatile 对比:volatile 保证共享变量的可见性和有序性,但不保证原子性;synchronized 保证原子性、可见性和有序性。
  5. 线程池核心参数:核心线程数(常驻线程)、最大线程数(核心线程 + 救急线程)、存活时间(救急线程空闲时长)、时间单位、工作队列(存放待处理任务)、线程工厂(创建线程)、拒绝策略(队列满且线程全忙时,如 AbortPolicy 抛异常、CallerRunsPolicy 让提交线程处理等)。

六、JVM 虚拟机

  1. 堆内存结构:传统垃圾回收器将堆分为老年代和年轻代(Eden、S0、S1);G1 回收器将堆分为多个 Region,可分别作为 Eden、幸存区、老年代、巨型对象区。
  2. 垃圾回收算法:标记 - 清除算法(快但产生碎片);标记 - 整理算法(无碎片但慢);标记 - 复制算法(将内存分为 S0 和 S1,复制存活对象到 S1 后清空 S0,无碎片,适合存活对象少的场景)。
  3. 伊甸园、幸存区、老年代细节:对象初始在 Eden,年轻代回收(标记 - 复制)后存活对象进入 S0;再次回收时,Eden 和 S0 的存活对象复制到 S1,二者互换;多次回收后存活的对象晋升老年代。大对象在不同回收器中处理不同,如 CMS 中超过阈值直接进老年代,G1 中巨型对象存于专用 Region。

七、Lambda 表达式

Lambda 表达式是匿名函数(语法:(参数) -> 表达式),本质是函数对象,用于行为参数化场景(如 Stream API、MyBatisPlus 的 QueryWrapper)。与匿名内部类相比,Lambda 需配合函数式接口,语法更简洁,this 含义不同,运行时动态生成类。

八、反射及泛型

  1. 反射:Java 提供的 API,可在运行时加载类、获取类信息(属性、方法等)、创建对象、调用方法。广泛用于框架(如 Spring 的 Bean 创建、MyBatis 的结果映射),但效率较低。
  2. 泛型:实现类型参数化,可用于类、接口、方法,提供编译时类型检查(避免运行时转换错误),提高代码通用性(如 List<T>可存储任意类型元素)。

九、Tomcat 优化

Tomcat 优化可调整线程池和网络配置,如 springboot 默认配置中,max-connections 控制最大连接数,accept-count 控制连接队列数,threads.max 控制最大线程数,threads.min-spare 控制最小备用线程数。JDK 21 配合 SpringBoot 3.2.x 可使用虚拟线程优化,提升并发处理能力。

相关文章
|
4月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
4月前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
5月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
5月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
516 100
|
5月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
572 1
|
5月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
1356 0
|
5月前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
435 0
|
5月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
850 1
|
5月前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
667 44
|
5月前
|
Java
Java的CAS机制深度解析
CAS(Compare-And-Swap)是并发编程中的原子操作,用于实现多线程环境下的无锁数据同步。它通过比较内存值与预期值,决定是否更新值,从而避免锁的使用。CAS广泛应用于Java的原子类和并发包中,如AtomicInteger和ConcurrentHashMap,提升了并发性能。尽管CAS具有高性能、无死锁等优点,但也存在ABA问题、循环开销大及仅支持单变量原子操作等缺点。合理使用CAS,结合实际场景选择同步机制,能有效提升程序性能。