1. 为什么需要Java速通基础?
作为一名从业10年的Java开发者,我见过太多初学者在Java入门阶段浪费大量时间。传统的Java学习路径往往从环境配置开始,然后是语法细节、面向对象概念,最后才接触到实际开发。这种学习方式效率低下,容易让人在初期就失去兴趣。
Java速通基础课的核心价值在于:用最短的时间掌握Java开发中最常用的20%核心知识,这些知识能覆盖实际工作中80%的场景。不同于学院派教学,我们直接从实战需求出发,重点讲解那些真正影响开发效率的关键点。
举个例子,数组越界异常(ArrayIndexOutOfBoundsException)是新手最常见的错误之一。在传统教学中,可能要等到学完所有基础语法才会遇到这个异常。而在速通课程中,我们会在第一个实战练习中就故意触发这个异常,让你立即理解边界检查的重要性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Java开发环境极简配置
2.1 JDK选择与安装
2023年最新的LTS版本是Java 17,但企业中使用最广泛的仍然是Java 8和Java 11。对于初学者,我推荐直接安装Java 17:
bash复制# Ubuntu/Debian
sudo apt install openjdk-17-jdk
# MacOS
brew install openjdk@17
# Windows
# 从Oracle官网下载JDK 17安装包
安装后验证版本:
bash复制java -version
注意:如果遇到"源发行版17需要目标发行版17"的警告,说明你的IDE设置与JDK版本不匹配,需要在项目设置中调整。
2.2 环境变量配置
虽然现代IDE大多能自动识别JDK,但正确配置JAVA_HOME仍然是必要的:
bash复制# Linux/Mac
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
# Windows
# 系统属性 -> 高级 -> 环境变量
# 新建系统变量 JAVA_HOME=C:\path\to\jdk-17
2.3 IDE选择
IntelliJ IDEA是Java开发的事实标准,但VSCode也是不错的选择:
- IntelliJ IDEA:功能全面,适合大型项目
- VSCode:轻量级,适合小型项目和教学
- Eclipse:逐渐被淘汰,不推荐新手使用
3. Java核心语法精要
3.1 基本数据类型与运算符
Java有8种基本数据类型:
| 类型 | 大小 | 范围 | 默认值 |
|---|---|---|---|
| byte | 1字节 | -128~127 | 0 |
| short | 2字节 | -32,768~32,767 | 0 |
| int | 4字节 | -2^31~2^31-1 | 0 |
| long | 8字节 | -2^63~2^63-1 | 0L |
| float | 4字节 | IEEE 754 | 0.0f |
| double | 8字节 | IEEE 754 | 0.0d |
| char | 2字节 | \u0000~\uffff | '\u0000' |
| boolean | - | true/false | false |
运算符优先级记忆口诀:
code复制单目乘除位关系,逻辑三目后赋值
3.2 流程控制
switch语句在Java 12后有了更简洁的写法:
java复制// 传统写法
switch (day) {
case 1:
System.out.println("Monday");
break;
// ...
}
// Java 12+ 箭头语法
switch (day) {
case 1 -> System.out.println("Monday");
case 2 -> System.out.println("Tuesday");
// ...
}
3.3 异常处理
Java异常分为检查型异常和非检查型异常:
java复制try {
// 可能抛出异常的代码
} catch (ArrayIndexOutOfBoundsException e) {
// 处理数组越界
} catch (NullPointerException e) {
// 处理空指针
} finally {
// 无论是否异常都会执行
}
内存不足错误(OutOfMemoryError)是JVM级别的错误,通常无法在代码中捕获处理,需要通过JVM参数调整:
bash复制java -Xmx512m YourApplication
4. 面向对象编程核心
4.1 类与对象
一个完整的类示例:
java复制public class Person {
// 字段
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 方法
public void introduce() {
System.out.println("我叫" + name + ", 今年" + age + "岁");
}
// Getter/Setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
4.2 接口与抽象类
接口(interface)与抽象类(abstract class)的区别:
| 特性 | 接口 | 抽象类 |
|---|---|---|
| 实例化 | 不能 | 不能 |
| 实现/继承 | 可实现多个 | 只能继承一个 |
| 字段 | 默认public static final | 任意访问修饰符 |
| 方法 | Java 8前只能抽象 | 可包含具体方法 |
| 设计目的 | 定义行为契约 | 代码复用 |
4.3 常用设计模式
- 单例模式:
java复制public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
- 工厂模式:
java复制public interface Shape {
void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("画圆");
}
}
public class ShapeFactory {
public Shape getShape(String type) {
if ("circle".equals(type)) {
return new Circle();
}
return null;
}
}
5. Java集合框架
5.1 主要集合类
Java集合框架主要接口:
code复制Collection
├── List
│ ├── ArrayList
│ ├── LinkedList
│ └── Vector
├── Set
│ ├── HashSet
│ └── TreeSet
└── Queue
└── Deque
└── ArrayDeque
Map
├── HashMap
├── TreeMap
└── LinkedHashMap
5.2 集合使用示例
java复制List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.forEach(System.out::println);
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);
map.forEach((k, v) -> System.out.println(k + ": " + v));
5.3 集合性能比较
| 集合类型 | 获取 | 插入 | 删除 | 内存 |
|---|---|---|---|---|
| ArrayList | O(1) | O(1)~O(n) | O(n) | 紧凑 |
| LinkedList | O(n) | O(1) | O(1) | 分散 |
| HashSet | O(1) | O(1) | O(1) | 较大 |
| TreeSet | O(log n) | O(log n) | O(log n) | 较大 |
6. Java I/O与NIO
6.1 传统I/O
java复制// 读取文件
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
// 写入文件
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
bw.write("Hello Java");
}
6.2 NIO核心组件
Java NIO的主要组件:
- Channels:FileChannel, SocketChannel等
- Buffers:ByteBuffer, CharBuffer等
- Selectors:多路复用器
java复制// 使用NIO读取文件
try (RandomAccessFile file = new RandomAccessFile("file.txt", "r");
FileChannel channel = file.getChannel()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (channel.read(buffer) != -1) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear();
}
}
7. 多线程编程
7.1 线程创建方式
- 继承Thread类:
java复制class MyThread extends Thread {
public void run() {
System.out.println("线程运行中");
}
}
new MyThread().start();
- 实现Runnable接口:
java复制new Thread(() -> {
System.out.println("Lambda表达式创建线程");
}).start();
7.2 线程池使用
java复制ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
executor.submit(() -> {
System.out.println(Thread.currentThread().getName() + "执行任务");
});
}
executor.shutdown();
7.3 线程同步
java复制// synchronized方法
public synchronized void increment() {
count++;
}
// Lock接口
private final Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
8. Java新特性速览
8.1 Java 8主要特性
- Lambda表达式:
java复制List<String> names = Arrays.asList("Alice", "Bob");
names.forEach(name -> System.out.println(name));
- Stream API:
java复制List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(n -> n * 2)
.sum();
8.2 Java 11特性
- 新的字符串方法:
java复制String str = " Java ";
str.strip(); // "Java"
str.repeat(2); // " Java Java "
- 局部变量类型推断:
java复制var list = new ArrayList<String>();
8.3 Java 17特性
- 密封类(Sealed Classes):
java复制public sealed class Shape permits Circle, Square {
// ...
}
public final class Circle extends Shape {
// ...
}
- 模式匹配instanceof:
java复制if (obj instanceof String s) {
System.out.println(s.length());
}
9. 常见问题与解决方案
9.1 Lombok不工作问题
错误信息:"You aren't using a compiler supported by lombok"通常是因为:
- IDE没有启用注解处理
- 项目中没有正确配置Lombok插件
解决方案:
- 在IntelliJ中:Settings -> Build -> Compiler -> Annotation Processors -> Enable
- 确保pom.xml中包含:
xml复制<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
9.2 编码问题
VSCode运行Java出现乱码:
- 确保文件保存编码为UTF-8
- 运行配置中添加:
json复制"vmArgs": "-Dfile.encoding=UTF-8"
9.3 内存不足问题
"Idea java: OutOfMemoryError: insufficient memory"解决方案:
- 增加IDE内存:Help -> Change Memory Settings
- 调整项目运行配置:
bash复制-Xms512m -Xmx2048m
10. Java学习资源推荐
10.1 在线学习平台
- Oracle官方Java教程
- Baeldung Java系列教程
- Java官方文档
10.2 书籍推荐
- 《Java核心技术 卷I》
- 《Effective Java》
- 《Java并发编程实战》
10.3 项目实践
初学者可以尝试以下项目:
- 学生管理系统(控制台版)
- 简易HTTP服务器
- 多线程下载器
11. Java面试准备
11.1 基础八股文
常见面试题:
- Java中的==和equals()区别
- String, StringBuilder, StringBuffer区别
- HashMap实现原理
- JVM内存模型
- 垃圾回收机制
11.2 算法题准备
LeetCode Java标签高频题目:
- 两数之和
- 反转链表
- 有效的括号
- 合并两个有序链表
- 二叉树的中序遍历
11.3 系统设计基础
Java开发者需要了解:
- 设计RESTful API
- 数据库连接池配置
- 缓存策略
- 微服务架构
12. Java进阶路线
掌握基础后可以学习:
- Spring框架(Spring Boot)
- 数据库访问(JPA/Hibernate/MyBatis)
- 分布式系统(Dubbo/Spring Cloud)
- 性能调优(JVM参数, 线程池配置)
- 安全编程(加密, OAuth2)
13. 实际开发中的经验技巧
- 使用try-with-resources确保资源关闭:
java复制try (Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
// 处理结果集
}
- 使用Objects.equals()避免空指针:
java复制if (Objects.equals(str1, str2)) {
// 安全比较
}
- 日志记录使用SLF4J+Log4j2:
java复制private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
logger.debug("调试信息: {}", someValue);
- 使用Guava工具类简化代码:
java复制List<String> list = Lists.newArrayList("a", "b", "c");
Map<String, Integer> map = ImmutableMap.of("a", 1, "b", 2);
- 单元测试最佳实践:
java复制@Test
public void testAdd() {
Calculator calc = new Calculator();
assertEquals(5, calc.add(2, 3));
}
14. Java与其他技术栈集成
14.1 Java与STM32通信
通过串口通信:
java复制// 使用RXTX库
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("/dev/ttyUSB0");
SerialPort serialPort = (SerialPort) portId.open("JavaComm", 2000);
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();
// 发送数据
out.write("Hello STM32".getBytes());
14.2 Java对接AIS数据
AIS(船舶自动识别系统)数据处理:
java复制// 解析AIS消息
public AisMessage parseAisMessage(String rawMessage) {
// 实现AIS消息解析逻辑
return new AisMessage(...);
}
// 使用WebSocket接收实时AIS数据
@ClientEndpoint
public class AisClient {
@OnMessage
public void onMessage(String message) {
AisMessage aisMessage = parseAisMessage(message);
// 处理消息
}
}
15. Java性能优化
15.1 JVM参数调优
常用参数组合:
bash复制java -Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar app.jar
15.2 代码级优化
- 使用StringBuilder拼接字符串
- 避免在循环中创建对象
- 使用基本类型而非包装类
- 合理设置集合初始容量
- 使用枚举替代常量
15.3 并发优化
- 使用线程池而非直接创建线程
- 合理设置线程池参数
- 使用并发集合(ConcurrentHashMap等)
- 减少锁粒度
- 使用读写锁(ReentrantReadWriteLock)
16. Java与现代开发实践
16.1 测试驱动开发(TDD)
Java TDD流程:
- 编写失败的单元测试
- 实现最小功能使测试通过
- 重构代码
示例(JUnit 5):
java复制@Test
void testAddition() {
Calculator calc = new Calculator();
assertEquals(4, calc.add(2, 2));
}
16.2 持续集成
Maven项目CI配置示例:
xml复制<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
16.3 容器化部署
Dockerfile示例:
dockerfile复制FROM openjdk:17-jdk-slim
COPY target/myapp.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
17. Java生态系统工具
17.1 构建工具
Maven vs Gradle对比:
| 特性 | Maven | Gradle |
|---|---|---|
| 配置语言 | XML | Groovy/Kotlin DSL |
| 性能 | 较慢 | 更快(增量构建) |
| 灵活性 | 约定优于配置 | 高度可定制 |
| 学习曲线 | 平缓 | 较陡峭 |
17.2 代码质量工具
- SonarQube:静态代码分析
- Checkstyle:代码风格检查
- SpotBugs:查找潜在bug
- JaCoCo:代码覆盖率
17.3 开发辅助工具
- Lombok:减少样板代码
- MapStruct:对象映射
- JUnit 5:单元测试
- Mockito:测试mock
18. Java未来发展趋势
- 云原生Java(Quarkus, Micronaut)
- GraalVM原生镜像
- 记录类(Record)的更多应用
- 模式匹配的进一步强化
- 虚拟线程(Project Loom)
19. 从Java基础到项目实战
一个完整的Java项目开发流程:
- 需求分析
- 技术选型
- 项目初始化(Maven/Gradle)
- 领域模型设计
- 数据库设计
- API设计
- 实现业务逻辑
- 单元测试
- 集成测试
- 部署上线
20. Java开发者成长建议
- 保持学习新技术,但先精通核心Java
- 阅读优秀开源代码(如Spring, Guava)
- 参与开源项目贡献
- 定期复习基础(集合, 并发, JVM)
- 建立个人技术博客记录学习心得
- 参加技术社区活动(Meetup, 大会)
