Java · 01 语言基础
语法、类型、集合、函数——服务交付与协作,不是语法百科。面试细题见 就业指南 · Java。
1. 定位:Java 卖什么
Java 卖的是 可控与存量:
- 静态类型 + 编译期检查:大项目改起来相对敢下手
- 工程型语言:强调可维护、可协作,而不是写起来最短
- 生态绑死企业场景:ORM、中间件、监控、招聘市场都围绕它转
- 「慢热」:启动和样板代码有成本,换来的是长期可预期
一句话:Java 不是爽感语言,是 长期系统的默认承重墙。
和本站其它语言的分工
| 语言 | 角色 | 什么时候上 |
|---|---|---|
| Java | 主业务、库表权威、事务与权限 | 默认 |
| Python | AI / 脚本 / 胶水 | 模型与批处理 |
| Node(TS) | BFF / Electron 本地服务 | 靠近前端与桌面 |
| Go | 边车、小高并发工具 | 补位 |
| C# | Windows / .NET 存量 | 撞上再学 |
2. 类型系统:怎么用才省事
该坚持的
- 业务入参出参用明确类型,少用裸
Map<String, Object>当领域模型 - 集合声明用接口类型:
List/Map,实现类留给创建处 - 空值策略统一:要么 Optional 用在返回值边界,要么约定「禁止 null + 校验」,团队内二选一
现代语法(Java 8+)我怎么用
| 特性 | 我会用 | 我会克制 |
|---|---|---|
| Lambda / 方法引用 | 回调、集合短变换 | 嵌套三层看不懂的写法 |
| Stream | filter/map/collect | 热点路径里无意义的多次中间集合 |
| Optional | 方法返回「可能没有」 | 字段到处 Optional、get() 乱飞 |
var | 右边类型已经很明显时 | 公共 API 签名里炫技 |
| record(新版本) | 不可变 DTO / 事件 | 强行替代一切实体 |
异常
- 受检异常有历史包袱:边界转换成业务错误码 / 运行时异常,避免
throws Exception污染整条调用链 - 业务可预期失败(库存不足、状态不允许)用明确错误模型,不要全靠异常控制流程
- 真正异常(下游超时、磁盘满)打日志 + 可观测,必要时熔断降级
3. 集合与常用 API
选型直觉
| 场景 | 常用选择 | 注意 |
|---|---|---|
| 有序列表 | ArrayList | 随机访问快;中间插入多再考虑 LinkedList(实际很少) |
| 去重 / 存在判断 | HashSet | 元素要正确实现 equals/hashCode |
| 键值 | HashMap | 单线程默认;并发读多写少 → ConcurrentHashMap |
| 有序键 | TreeMap / LinkedHashMap | 排序成本 vs 插入序 |
| 队列 | ArrayBlockingQueue 等 | 线程池、异步任务背压 |
equals / hashCode
实体进 Set / 当 Map key 时必须成对正确;只改业务字段、用 IDE 生成或用业务主键策略,避免「明明同一个单号却去重失败」。
函数式接口
Function / Predicate / Consumer / Supplier 让回调短。原则:可读性优先——同事 10 秒看不懂的一行 Stream,不如三行 for。
4. 面向对象:交付里真正有用的部分
- 封装边界:Controller 薄、Service 承载用例、基础设施向外适配
- 组合优于深层继承:业务差异用策略 / 多态,少造七层基类
- 接口面向能力:
PaymentGateway而不是绑死某 SDK 类名
八股式「三大特性」能答;落地更看 模块怎么切、依赖怎么指。
5. 我为什么仍把 Java 当主栈
- ToB / 工业 / CRM 类交付,招聘与中间件默认就是它
- 静态类型在多人、多月项目上更敢改
- 和 Spring 绑在一起后,批量交业务的路径最熟
- AI 来了也不换墙:Java 管状态与配额,Python 管模型试错
下一篇:02 核心能力(JVM、并发、内存——语言真正不同的地方)