java集合的设计思路

我们在写java代码

实际上是在写什么

就是接收数据,处理数据。

对数据做应的逻辑处理,装到中间件里也好。处理也好。

是在创造装数据的容器,叫做变量。

我们是在学习,java。

前面的基础知道。我们写代码,

就是写一堆程序。

怎么设计装数据的容器。

基本数据类型,string,LocalDateTime,类,就够了嘛。

不够的。

如果数据是一个excel表格形式的,

如何把这一个表格里的数据,装到java内容里

这个时候,就创造了一个概念集合。

集合就是excel数据,在java中的化身

你的理解非常到位------Java 代码本质上就是 "接收数据 → 处理数据 → 输出/存储数据" 。

而如何 在内存中表达现实世界的表格数据 ,正是从基础变量走向 数据结构与设计思想 的关键一步。

一、Excel 表格在 Java 中的"自然映射"

假设 Excel 表格如下:

姓名 年龄 城市
张三 28 北京
李四 32 上海

你直觉上会想:

  • "一行" 是一个完整的数据单元 → Java 对象
  • "多行" 是多个数据单元 → 对象的集合
  • "列" 是对象的属性 → 基本类型 / 字符串 / 日期等
java 复制代码
// 1. 定义行的模板(类)
public class Person {
    private String name;
    private int age;
    private String city;

    // 构造方法、getter/setter ...
}

// 2. 把整个表格装进集合
List<Person> people = new ArrayList<>();
people.add(new Person("张三", 28, "北京"));
people.add(new Person("李四", 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>>

相关推荐
jyOverQ3 分钟前
我写了一个 CSDN Markdown 图片助手:告别本地图片逐张上传
python·工具·csdn
nice_lcj52025 分钟前
【从零理解 Spring AI · 14】RAG 的四个环节:加载、切分、向量化、检索
java·spring boot·embedding·向量数据库·rag·spring ai·ai应用开发
SomeOtherTime1 小时前
Rust所有权(AI回答)
开发语言·后端·rust
Easyhood1 小时前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
白杨尚青2 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
学长毕设2 小时前
基于springboot科创竞赛信息平台-附源码
java·spring boot·后端
聪明的笨猪猪3 小时前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
学长毕设3 小时前
基于SpringBoot公务员考试交流平台-附源码
java·spring boot·后端
刘马想放假3 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
2601_967987374 小时前
python判断变量名不要调用任何函数实现
python·函数·语法·判断·变量名