类型与变量
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。String 字面量因常量池可能 == 为 true,但这不是可靠写法。
面向对象
类是对象的蓝图。封装(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"。过度继承会让层次僵硬,优先用组合与接口解耦。
接口与多态
接口定义契约,类用 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"));泛型
泛型提供编译期类型安全,避免强制转换。常见边界 <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"); // 只能放 StringJava 泛型在运行时被擦除,new T[] 不允许。需要类型令牌时用 Class<T> 参数传入。
集合框架
List(有序可重复)、Set(去重)、Map(键值)三大族。ArrayList 随机访问快,HashMap 查找 O(1),TreeMap 有序。
| 实现 | 特点 | 适用 |
|---|---|---|
| ArrayList | 数组、随机访问快、插入慢 | 读多写少 |
| HashMap | 哈希、O(1) 查找 | 键值映射 |
| ConcurrentHashMap | 线程安全分段 | 并发读写 |
异常机制
受检异常(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 {} 会丢失问题现场。至少记录日志,或包装成有意义的业务异常向上抛。
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(); // 6parallelStream 用公共 ForkJoinPool,阻塞操作会拖累全局。CPU 密集且数据量大时才考虑,并指定自定义线程池。
常见陷阱与 FAQ
Integer 对 -128~127 有缓存,Integer.valueOf(127)==valueOf(127) 为 true,超出范围则为 false。永远用 equals 比对象值。
循环内大量拼接用 StringBuilder,避免产生大量中间对象;单次拼接编译器已优化,差异不大。
在业务边界把底层受检异常转换为运行时异常或领域异常,避免污染上层签名;保留受检异常于"调用方必须处理"的场景。