1. Java基础概述与环境搭建
Java作为一门面向对象的编程语言,自1995年诞生以来就以其"一次编写,到处运行"的特性风靡全球。对于初学者而言,掌握Java基础是进入编程世界的重要第一步。我们先从最基础的环境搭建开始讲起。
1.1 JDK安装与环境变量配置
安装Java开发环境的第一步是下载JDK(Java Development Kit)。目前Oracle官方提供的最新LTS版本是JDK 17,这也是企业开发的主流选择。安装完成后,需要配置三个关键环境变量:
- JAVA_HOME:指向JDK安装目录(如C:\Program Files\Java\jdk-17)
- Path:添加%JAVA_HOME%\bin路径
- CLASSPATH:设置类加载路径(现代Java版本通常不需要手动设置)
验证安装是否成功,可以在命令行输入:
java -version javac -version如果正确显示版本信息,说明环境配置成功。这里有个常见坑点:如果同时安装了多个JDK版本,可能会出现"源发行版17需要目标发行版17"的警告,这通常是因为编译环境和运行环境版本不一致导致的。
1.2 开发工具选择
对于Java初学者,我推荐以下工具组合:
- 代码编辑器:VS Code + Java扩展包(轻量级,适合学习)
- 集成开发环境:IntelliJ IDEA(企业级开发首选)
- 构建工具:Maven/Gradle(建议从Maven开始学习)
特别提醒:使用Lombok插件时,如果遇到"you aren't using a compiler supported by lombok"错误,需要确保IDE中启用了注解处理器(Annotation Processors)。
2. Java核心语法精要
2.1 基础数据类型与运算符
Java有8种基本数据类型:
- 整型:byte(1字节)、short(2)、int(4)、long(8)
- 浮点型:float(4)、double(8)
- 字符型:char(2)
- 布尔型:boolean(1)
类型转换是初学者的常见痛点。记住两个原则:
- 小类型转大类型自动完成(隐式转换)
- 大类型转小类型需要强制转换(显式转换),可能丢失精度
int a = 100; long b = a; // 自动转换 double c = 3.14; int d = (int)c; // 强制转换,d=32.2 流程控制结构
Java的流程控制分为三类:
- 条件语句:if-else, switch-case
- 循环语句:for, while, do-while
- 跳转语句:break, continue, return
特别说明switch表达式(Java 12+特性):
String day = "MON"; String dayType = switch (day) { case "MON", "TUE", "WED", "THU", "FRI" -> "Weekday"; case "SAT", "SUN" -> "Weekend"; default -> throw new IllegalArgumentException("Invalid day: " + day); };3. 面向对象编程核心
3.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("Hello, I'm " + name); } } // 使用 Person p = new Person("Alice", 25); p.introduce();3.2 三大特性:封装、继承、多态
- 封装:通过private保护数据,提供public方法访问
public class BankAccount { private double balance; public void deposit(double amount) { if (amount > 0) { balance += amount; } } }- 继承:extends关键字实现代码复用
class Animal { void eat() { System.out.println("Eating..."); } } class Dog extends Animal { void bark() { System.out.println("Barking..."); } }- 多态:父类引用指向子类对象
Animal myDog = new Dog(); myDog.eat(); // 可以调用 // myDog.bark(); // 编译错误,Animal类没有bark方法4. Java常用工具类与集合框架
4.1 字符串处理
String类是不可变的,对字符串修改操作都会创建新对象。频繁字符串拼接应该使用StringBuilder:
StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append(" "); sb.append("World"); String result = sb.toString(); // "Hello World"4.2 集合框架
Java集合框架主要接口:
- List:有序可重复 - ArrayList, LinkedList
- Set:无序唯一 - HashSet, TreeSet
- Map:键值对 - HashMap, TreeMap
典型用法示例:
// List示例 List<String> fruits = new ArrayList<>(); fruits.add("Apple"); fruits.add("Banana"); fruits.get(0); // "Apple" // Map示例 Map<String, Integer> scores = new HashMap<>(); scores.put("Alice", 90); scores.put("Bob", 85); scores.get("Alice"); // 90集合遍历的几种方式:
// 传统for循环 for (int i = 0; i < fruits.size(); i++) { System.out.println(fruits.get(i)); } // 增强for循环 for (String fruit : fruits) { System.out.println(fruit); } // 迭代器 Iterator<String> it = fruits.iterator(); while (it.hasNext()) { System.out.println(it.next()); } // Java 8+ forEach fruits.forEach(System.out::println);5. 异常处理与IO操作
5.1 异常处理机制
Java异常分为:
- 检查型异常(Checked Exception):必须处理
- 非检查型异常(Unchecked Exception):RuntimeException及其子类
标准处理模式:
try { // 可能抛出异常的代码 FileInputStream fis = new FileInputStream("test.txt"); } catch (FileNotFoundException e) { // 处理文件未找到异常 System.err.println("文件未找到: " + e.getMessage()); } finally { // 无论是否发生异常都会执行 System.out.println("清理资源"); }Java 7引入的try-with-resources语法:
try (FileInputStream fis = new FileInputStream("test.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(fis))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }5.2 文件IO操作
Java NIO2(Java 7+)提供了更简洁的文件操作API:
Path path = Paths.get("test.txt"); // 读取所有行 List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8); // 写入文件 Files.write(path, "Hello World".getBytes(), StandardOpenOption.CREATE);6. Java新特性与编码实践
6.1 Java 8+核心新特性
- Lambda表达式:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.sort((a, b) -> a.compareTo(b));- Stream API:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .filter(n -> n % 2 == 0) .mapToInt(n -> n * 2) .sum();- 新的日期时间API(java.time包):
LocalDate today = LocalDate.now(); LocalDate nextWeek = today.plusWeeks(1); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String formatted = nextWeek.format(formatter);6.2 编码最佳实践
- 命名规范:
- 类名:大驼峰,如StudentManager
- 方法名:小驼峰,如getStudentName
- 常量:全大写加下划线,如MAX_COUNT
- 代码组织原则:
- 单一职责原则(一个类只做一件事)
- 开闭原则(对扩展开放,对修改关闭)
- 使用接口编程而非具体实现
- 文档注释:
/** * 计算两个数的和 * @param a 第一个加数 * @param b 第二个加数 * @return 两数之和 */ public int add(int a, int b) { return a + b; }7. 调试与性能优化
7.1 常见调试技巧
- 使用IDE调试器:
- 断点调试
- 条件断点
- 表达式求值
- 日志记录:
import java.util.logging.Logger; public class MyClass { private static final Logger LOGGER = Logger.getLogger(MyClass.class.getName()); public void doSomething() { LOGGER.info("方法开始执行"); try { // 业务逻辑 } catch (Exception e) { LOGGER.severe("发生错误: " + e.getMessage()); } } }7.2 JVM基础与性能考量
- 内存模型要点:
- 堆(Heap):对象实例存储区
- 栈(Stack):方法调用和局部变量
- 方法区:类信息、常量、静态变量
- 常见性能优化手段:
- 避免创建不必要的对象
- 使用StringBuilder代替字符串拼接
- 合理使用集合的初始容量
- 及时关闭IO资源
- 简单的内存分析:
// 获取JVM内存信息 Runtime runtime = Runtime.getRuntime(); long totalMemory = runtime.totalMemory(); // 当前JVM占用的内存总数 long freeMemory = runtime.freeMemory(); // 当前JVM空闲内存 long usedMemory = totalMemory - freeMemory; // 已使用内存8. Java学习路线与面试准备
8.1 系统学习路径建议
- 基础阶段(1-2个月):
- 语法基础
- 面向对象
- 集合框架
- IO/NIO
- 进阶阶段(2-3个月):
- 多线程
- 网络编程
- JVM原理
- 设计模式
- 框架阶段(3-6个月):
- Spring全家桶
- ORM框架
- 微服务架构
8.2 面试常见问题解析
- Java基础八股文高频考点:
- HashMap实现原理
- JVM内存模型
- 线程池工作原理
- volatile关键字作用
- synchronized与Lock区别
- 算法题准备:
- 排序算法(快速排序、归并排序)
- 二叉树遍历
- 动态规划基础
- 链表操作
- 项目经验梳理:
- 准备2-3个有深度的项目
- 明确自己在项目中的角色和贡献
- 能够解释项目的技术选型和架构设计
在实际面试中,我发现很多候选人能背概念但缺乏实际应用经验。建议在学习每个知识点时,都尝试用简单的代码示例来验证理解,比如手动实现一个简化版的ArrayList,这比死记硬背效果要好得多。