我们在写java代码
实际上是在写什么
就是接收数据,处理数据。
对数据做应的逻辑处理,装到中间件里也好。处理也好。
是在创造装数据的容器,叫做变量。
我们是在学习,java。
前面的基础知道。我们写代码,
就是写一堆程序。
怎么设计装数据的容器。
基本数据类型,string,LocalDateTime,类,就够了嘛。
不够的。
如果数据是一个excel表格形式的,
如何把这一个表格里的数据,装到java内容里
这个时候,就创造了一个概念集合。
集合就是excel数据,在java中的化身
你的理解非常到位——Java 代码本质上就是“接收数据 → 处理数据 → 输出/存储数据”。
而如何在内存中表达现实世界的表格数据,正是从基础变量走向数据结构与设计思想的关键一步。
一、Excel 表格在 Java 中的“自然映射”
假设 Excel 表格如下:
| 姓名 | 年龄 | 城市 |
|---|---|---|
| 张三 | 28 | 北京 |
| 李四 | 32 | 上海 |
你直觉上会想:
- “一行” 是一个完整的数据单元 →Java 对象
- “多行” 是多个数据单元 →对象的集合
- “列” 是对象的属性 →基本类型 / 字符串 / 日期等
// 1. 定义行的模板(类)publicclassPerson{privateStringname;privateintage;privateStringcity;// 构造方法、getter/setter ...}// 2. 把整个表格装进集合List<Person>people=newArrayList<>();people.add(newPerson("张三",28,"北京"));people.add(newPerson("李四",32,"上海"));集合(如 List)就是 Excel 表格在 Java 内存中的化身。
二、为什么说“集合”是 Excel 的化身?
因为集合提供了表格所需的“核心能力”:
| Excel 操作 | Java 集合对应 |
|---|---|
| 一张表 | List<Person>或Set<Person> |
| 一行 | 一个Person对象 |
| 一列 | 对象的同一个属性(如name) |
| 按行号访问 | list.get(行索引) |
| 筛选 | stream().filter(...) |
| 新增行 | list.add(...) |
| 删除行 | list.remove(...) |
| 排序 | Collections.sort(...)或Comparator |
没有集合:你得用多个单独的变量 →person1,person2… 没法统一操作。
有了集合:表格的“整体感”就在内存中被还原了。
三、但这还不够——什么时候需要更复杂的设计?
你提到的“基本类型、String、LocalDateTime、类”确实常用,但遇到以下情况,就要升级容器设计:
1. 列名也是数据(动态列)
Excel 列不确定,比如第一行是“参数1、参数2、参数3”
→ 用Map<String, Object>表示一行,List<Map<String, Object>>表示整个表。
2. 表格之间存在引用关系
订单表 + 商品表 + 用户表
→ 用Map<订单ID, 订单对象>,订单对象里包含List<商品>和用户ID。
3. 海量数据(内存装不下)
Excel 有 100 万行
→ 不能简单用List<Person>,会 OOM。
→ 改用游标式读取+逐行处理,或数据库 + ORM(如 MyBatis),集合只是处理窗口。
4. 需要多维表格 / 分组
比如“按城市分组,再按年龄分组”
→Map<String, Map<Integer, List<Person>>>
→ 或者用Stream的Collectors.groupingBy。
四、从“装数据的容器”到“数据的设计模式”
你正在无意中触达一个核心能力:数据建模。
写 Java 代码 → 设计变量 → 设计类 → 设计集合 →设计数据在内存中的流动与存储形态
| 场景 | 容器选择 |
|---|---|
| 单个实体 | 对象 (Person p) |
| 列表(有顺序) | List<T> |
| 去重 / 集合运算 | Set<T> |
| 快速按 key 查找 | Map<K,V> |
| 栈 / 队列 | Deque |
| 一行数据,列名不固定 | Map<String, Object> |
| 一对多关联 | Map<Key, List<Value>> |