Java 后端手册JAVA BACKEND

CHAPTER 01语言基础 · BASICS

Java 语言基础

类型系统、面向对象、泛型、异常、集合框架与函数式 Lambda。夯实写正确、可维护 Java 的地基。

开始阅读难度入门先修任意编程语言约2.5小时
01.1

类型与变量

Java 是静态强类型语言:8 种基本类型(int/long/double/boolean 等)与引用类型。String 是不可变对象,拼接会产生新对象。

int a = 10;                 // 基本类型,栈上
Integer b = 10;             // 自动装箱为 Integer
String s = "hi";            // 不可变
String t = s + "!";         // 产生新 String
final int MAX = 100;        // 常量
== 与 equals

基本类型用 == 比"值";对象用 == 比"引用",比内容用 equals。String 字面量因常量池可能 == 为 true,但这不是可靠写法。

01.2

面向对象

类是对象的蓝图。封装(private 字段 + getter/setter)、继承(extends,单继承)、构造器与方法重载是核心。

public class User {
    private Long id;
    private String name;
    public User(Long id, String name) { this.id = id; this.name = name; }
    public String getName() { return name; }
}
优先组合

继承表达"is-a",组合表达"has-a"。过度继承会让层次僵硬,优先用组合与接口解耦。

01.3

接口与多态

接口定义契约,类用 implements 提供实现。多态让"同一调用,不同行为",是解耦与可测试的关键。

interface Payable { void pay(BigDecimal amount); }
class AliPay implements Payable { public void pay(BigDecimal a) { /*...*/ } }

Payable p = new AliPay();   // 面向接口编程
p.pay(new BigDecimal("9.9"));
01.4

泛型

泛型提供编译期类型安全,避免强制转换。常见边界 <T extends Number>、通配符 ? extends/super。

class Box<T> {
    private T value;
    public void set(T v) { this.value = v; }
    public T get() { return value; }
}
Box<String> b = new Box<>();
b.set("ok");                 // 只能放 String
泛型擦除

Java 泛型在运行时被擦除,new T[] 不允许。需要类型令牌时用 Class<T> 参数传入。

01.5

集合框架

List(有序可重复)、Set(去重)、Map(键值)三大族。ArrayList 随机访问快,HashMap 查找 O(1),TreeMap 有序。

实现特点适用
ArrayList数组、随机访问快、插入慢读多写少
HashMap哈希、O(1) 查找键值映射
ConcurrentHashMap线程安全分段并发读写
01.6

异常机制

受检异常(Exception 子类,必须处理或声明 throws)与非受检异常(RuntimeException,可不选)。用 try-with-resources 自动关资源。

try (var in = new FileInputStream("a.txt")) {
    // 自动关闭 in
} catch (IOException e) {
    log.error("读文件失败", e);
    throw new RuntimeException(e);
}
别吞异常

空的 catch {} 会丢失问题现场。至少记录日志,或包装成有意义的业务异常向上抛。

01.7

Lambda 与 Stream

Lambda 让函数作为一等公民,Stream API 以声明式方式处理集合:过滤、映射、归约,链式可读。

List<Integer> nums = List.of(1, 2, 3, 4, 5);
int sum = nums.stream()
    .filter(n -> n % 2 == 0)
    .mapToInt(Integer::intValue)
    .sum();                 // 6
并行流慎用

parallelStream 用公共 ForkJoinPool,阻塞操作会拖累全局。CPU 密集且数据量大时才考虑,并指定自定义线程池。

01.8

常见陷阱与 FAQ

Integer 缓存导致的 == 迷惑?

Integer 对 -128~127 有缓存,Integer.valueOf(127)==valueOf(127) 为 true,超出范围则为 false。永远用 equals 比对象值。

StringBuilder 还是 String 拼接?

循环内大量拼接用 StringBuilder,避免产生大量中间对象;单次拼接编译器已优化,差异不大。

受检异常该不该一路 throws?

在业务边界把底层受检异常转换为运行时异常或领域异常,避免污染上层签名;保留受检异常于"调用方必须处理"的场景。

01.9

实战练习与资源

延伸资源