1. Java基础知识点速查手册:从入门到面试通关
作为一门诞生近30年依然稳居编程语言排行榜前三的常青树,Java凭借其稳定性、跨平台特性和丰富的生态体系,始终是企业级应用开发的首选语言。这份速查手册不同于传统教科书式的知识点罗列,而是结合我15年Java开发经验,将高频使用的核心概念、面试常考要点以及实际开发中的避坑技巧浓缩成这份实战指南。无论你是刚安装好JDK的新手,还是准备跳槽需要突击八股文的求职者,都能快速定位到关键信息。
2. Java开发环境配置与常见问题排查
2.1 JDK安装与环境变量配置
正确的环境配置是Java开发的起点,但也是新手最容易踩坑的环节。以当前主流的JDK17为例:
- 官网下载对应系统的安装包(建议选择LTS版本)
- 安装时记住安装路径(如
C:\Program Files\Java\jdk-17.0.2) - 配置系统环境变量:
JAVA_HOME= JDK安装路径Path中添加%JAVA_HOME%\bin
注意:Win10/11系统需要区分用户变量和系统变量,建议在系统变量中设置。安装后执行
java -version验证时若出现"不是内部命令"错误,通常是Path配置有误。
2.2 典型环境问题解决方案
问题1:java: 警告: 源发行版17需要目标发行版17这是IDE中编译版本与运行版本不一致导致的。在IntelliJ IDEA中:
- 检查Project Structure中的Project SDK和Project language level
- 检查Modules中的Language level
- 检查Settings -> Build -> Compiler -> Java Compiler的Target bytecode version
问题2:Lombok插件报错"you aren't using a compiler supported by lombok"解决方案:
- 确保安装了Lombok插件(File -> Settings -> Plugins)
- 在pom.xml中添加最新版本依赖
- 启用注解处理:Settings -> Build -> Compiler -> Annotation Processors
3. Java核心语法精要
3.1 数据类型与运算符
Java是强类型语言,数据类型分为两大类:
- 基本类型:8种(byte/short/int/long, float/double, char, boolean)
- 引用类型:类、接口、数组
易错点:
Integer a = 100, b = 100; System.out.println(a == b); // true(享元模式缓存-128~127) Integer c = 200, d = 200; System.out.println(c == d); // false位运算实战案例:
// 判断奇偶 boolean isEven = (num & 1) == 0; // 交换两数 a ^= b; b ^= a; a ^= b;3.2 流程控制与异常处理
数组越界异常处理:
try { int[] arr = new int[5]; System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException } catch (ArrayIndexOutOfBoundsException e) { System.out.println("捕获数组越界:" + e.getMessage()); }枚举高级用法:
public enum Status { PENDING("待处理", 1), PROCESSING("处理中", 2), COMPLETED("已完成", 3); private final String desc; private final int code; Status(String desc, int code) { this.desc = desc; this.code = code; } // getters... }4. 面向对象编程核心
4.1 类与对象
构造方法链式调用:
public class User { private String name; private int age; public User setName(String name) { this.name = name; return this; } public User setAge(int age) { this.age = age; return this; } } // 使用示例 new User().setName("张三").setAge(25);4.2 设计模式实践
单例模式双重检查锁实现:
public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }工厂模式结合Lambda:
interface ProductFactory { Product create(); } Map<String, ProductFactory> factories = new HashMap<>(); factories.put("A", () -> new ProductA()); factories.put("B", () -> new ProductB()); Product product = factories.get(type).create();5. 集合框架与算法
5.1 集合类性能对比
| 集合类型 | 时间复杂度 | 线程安全 | 适用场景 |
|---|---|---|---|
| ArrayList | 查询O(1) 增删O(n) | 不安全 | 随机访问频繁 |
| LinkedList | 查询O(n) 增删O(1) | 不安全 | 频繁插入删除 |
| HashMap | 平均O(1) | 不安全 | 键值对存储 |
| ConcurrentHashMap | 平均O(1) | 安全 | 高并发场景 |
5.2 经典算法实现
快速排序Java实现:
public static void quickSort(int[] arr, int low, int high) { if (low < high) { int pivot = partition(arr, low, high); quickSort(arr, low, pivot - 1); quickSort(arr, pivot + 1, high); } } private static int partition(int[] arr, int low, int high) { int pivot = arr[high]; int i = low; for (int j = low; j < high; j++) { if (arr[j] < pivot) { swap(arr, i, j); i++; } } swap(arr, i, high); return i; }质数判断优化算法:
public static boolean isPrime(int n) { if (n <= 1) return false; if (n == 2) return true; if (n % 2 == 0) return false; for (int i = 3; i * i <= n; i += 2) { if (n % i == 0) return false; } return true; }6. Java内存管理与性能调优
6.1 JVM内存模型
典型内存溢出场景分析:
- OutOfMemoryError: Java heap space- 堆内存不足
- 解决方案:调整-Xmx参数,检查内存泄漏
- OutOfMemoryError: PermGen space- 方法区溢出(JDK8前)
- 解决方案:调整-XX:MaxPermSize,或升级到JDK8+
- OutOfMemoryError: GC overhead limit exceeded- GC效率低下
- 解决方案:检查对象生命周期,优化GC策略
6.2 性能监控工具
常用JVM参数:
# 内存设置 -Xms512m -Xmx2g -XX:NewRatio=3 # GC日志 -XX:+PrintGCDetails -Xloggc:gc.log # 堆转储 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprofjps命令使用技巧:
jps -lvm # 查看所有Java进程及启动参数7. Java新特性实战
7.1 Lambda与Stream API
集合处理流水线示例:
List<String> result = transactions.stream() .filter(t -> t.getType() == Transaction.GROCERY) .sorted(comparing(Transaction::getValue).reversed()) .map(Transaction::getId) .collect(Collectors.toList());7.2 模块化系统(JPMS)
module-info.java示例:
module com.myapp { requires java.base; requires java.sql; requires transitive com.common; exports com.myapp.api; opens com.myapp.internal to com.test; }8. 常见面试题深度解析
8.1 高频八股文精讲
HashMap原理连环问:
- 数据结构:数组+链表+红黑树(JDK8+)
- 哈希冲突解决:链地址法
- 扩容机制:2倍扩容,rehash
- 线程安全问题:使用ConcurrentHashMap替代
JVM类加载过程:
- 加载 -> 验证 -> 准备 -> 解析 -> 初始化
- 双亲委派模型:防止重复加载
- 打破委派:Tomcat等容器的类加载策略
8.2 系统设计题思路
设计短链系统:
- 哈希算法选择:MurmurHash/自增ID
- 存储方案:Redis缓存+MySQL持久化
- 跳转流程:301/302重定向
- 统计功能:布隆过滤器防刷
9. 开发工具链配置
9.1 IDEA高效配置
优化启动参数:
- 修改idea64.exe.vmoptions:
-Xms1024m -Xmx2048m -XX:ReservedCodeCacheSize=512m - 关闭不必要的插件
- 启用Power Save模式(File -> Power Save Mode)
9.2 日志框架配置
Logback经典配置:
<configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="FILE" /> </root> </configuration>10. 实战经验与避坑指南
10.1 并发编程陷阱
synchronized使用误区:
- 锁对象选择:不要锁String常量等可能被复用的对象
- 锁粒度控制:过粗影响性能,过细增加复杂度
- 避免嵌套锁:容易导致死锁
CompletableFuture最佳实践:
CompletableFuture.supplyAsync(() -> fetchOrder()) .thenApplyAsync(order -> processPayment(order)) .thenAcceptAsync(receipt -> sendEmail(receipt)) .exceptionally(ex -> { log.error("流程异常", ex); return null; });10.2 性能优化黄金法则
- 测量优先:用JMH做基准测试,不要猜测性能瓶颈
- 缓存热点数据:但要注意缓存一致性问题
- 批量操作:减少数据库/网络往返次数
- 异步化:合理使用线程池和消息队列
- 数据结构选择:根据场景选择最优集合类型
在多年Java开发生涯中,我发现很多问题其实都有规律可循。比如内存泄漏往往发生在静态集合、未关闭的资源和监听器注册等场景;而性能问题则多源于不合理的算法、过度同步和频繁的IO操作。建议新手养成阅读源码的习惯,从ArrayList的扩容机制到ConcurrentHashMap的分段锁设计,这些经典实现都蕴含着宝贵的设计思想。