在 Java 中,这四者可以分为两大阵营:**线性容器**(数组、List)和**键值对容器**(Map、HashMap)。
* * *
### 1\. 核心区别对比
| **特性** | **数组 (Array)** | **List (如 ArrayList)** | **Map (接口)** | **HashMap (实现类)** |
| --- | --- | --- | --- | --- |
| **存储结构** | 连续的内存空间 | 动态数组(底层是数组) | 键值对 (Key-Value) | 哈希表 (数组+链表/红黑树) |
| **长度/容量** | **固定**,创建后不可变 | **动态**,自动扩容 | 动态扩容 | 动态扩容 |
| **访问方式** | 通过 **索引** (0, 1...) | 通过 **索引** 或 迭代器 | 通过 **键 (Key)** 获取值 | 通过 **键 (Key)** 获取值 |
| **存储类型** | 基本类型 & 引用类型 | 仅限引用类型 | 仅限引用类型 | 仅限引用类型 |
| **重复性** | 允许重复值 | 允许重复值 | **Key 唯一**,Value 可重复 | Key 唯一,Value 可重复 |
* * *
### 2\. 详细拆解与示例
#### **数组 (Array)**
Java 最底层的容器。速度最快,但灵活性最差。
* **适用场景**:已知固定数量的元素,追求极致性能。
* **示例**:
Java
~~~
// 定义一个长度为 3 的字符串数组
String[] names = new String[3];
names[0] = "张三";
names[1] = "李四";
// names.length 获取长度 (属性)
~~~
#### **List (集合/列表)**
最常用的线性容器,你可以把它看作是“加强版”的数组。
* **适用场景**:需要按顺序存储元素,且元素个数会变动(如:查出来的账单列表)。
* **示例**:
Java
~~~
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("张三"); // 允许添加重复元素
// list.get(0) 获取第一个元素
~~~
#### **Map 与 HashMap**
Map 是接口(定义了标准),HashMap 是 Map 接口最常用的实现类。
它们不按索引存,而是按“映射关系”存。
* **适用场景**:需要通过一个唯一标识(如学号、ID)快速查找数据。
* **示例**:
Java
~~~
// Map 是接口声明,HashMap 是具体实例化
Map<String, Integer> scoreMap = new HashMap<>();
scoreMap.put("张三", 90);
scoreMap.put("李四", 85);
scoreMap.put("张三", 100); // Key 唯一:这会覆盖掉之前的 90 分
System.out.println(scoreMap.get("张三")); // 输出 100
~~~
* * *
### 3\. 形象比喻
* **数组/List**:像一排有编号的**储物柜**。你想找东西,得记住它在几号柜子(索引)。
* **Map/HashMap**:像一本**字典**。你想找解释(Value),只需要搜索对应的单词(Key)。你不需要知道这个词在字典的第几页。
* * *
### 4\. 总结与选型建议
1. **如果你需要存一串东西,且经常要增删、不确定多少个**:选 **`List`** (通常是 `ArrayList`)。
2. **如果你需要通过某个“名字”或“ID”快速翻找东西**:选 **`HashMap`**。
3. **如果你处理的是非常底层的坐标、字节流,且长度永远不变**:选 **`数组`**。
**有趣的一点:** 在你最初的业务代码里,我们将 `billId` 字符串 `split` 成了 **数组**,随后为了方便统计结果,我们创建了一个 **HashMap**。这正好体现了它们各自的用处。
需要我为你演示一下如何用 **Map** 来优化那些复杂的“双重 for 循环”查询吗?(这是面试中非常常见的性能优化点)
- 环境配置
- window怎么配置java环境变量?
- SQL学习
- 字段类型
- 1、 所有可声明的字段类型
- 2、常用的可声明的字段类型
- 创建表和表内字段
- 1、整个创建表语句
- 2、设置id主键
- 3、设置业务主键,唯一索引
- 4、设置业务字段
- 5、普通索引
- 6、唯一索引与普通索引的区别
- 7、表的引擎、字符集、排序规则和注释的设置
- Java基础语法
- 数据类型
- Java中的数据类型
- LocalDate
- 常用的数据类型
- Java 常用数据类型方法
- Java中数组、list、Map、HashMap
- 如何用Map来优化那些复杂的“双重 for 循环”查询?
- Java 8 中steam()操作流
- Java中HashMap和JSON
- Java中的JSONObject
- 工具类
- Java 常用工具类
- Arrays工具类
- Java 时间工具类
- 泛型
- Java中泛型概念
- Java中的泛型容器
- 泛型参数与函数参数的区别
- 推断出泛型实参
- Lambda表达式
- 数据分层
- 异常处理
- Java8 异常处理类总结表
- MyBatis-Plus 常用异常类总结表
- Java高级特性
- Maven
- jib-maven-plugin
- 什么是Spring Boot 的 parent pom?
- maven中各个生命周期的含义
- Spring Boot
- maven与spring boot 的关系
- Java中的连接池
- Spring JDBC
- Spring JDBC的概念
- JdbcTemplate常用的方法
- Spring中Bean的概念
- Spring中的抽象,通俗解释一下
- Spring中的事物
- Spring中的事物,通俗解释一下
- Spring中的事物抽象,常见的有哪些,列举一下
- Spring中常用的事物场景有哪些,列举一下
- Spring事务管理有哪些注解?
- Spring中使用事物处理订单的案例,列举说明一下
- Spring中声明式事务、分布式事务以及编程式事务的区别,列举一下
- 配置文件
- application-properties配置文件
- Spring Boot 的启动
- spring boot项目如何启动?
- 列举一下Spring Boot的启动过程
- SpringApplication.run方法
- Spring Boot 启动时有哪些接口?
- CommandLineRunner
- Spring Boot 的常用注解
- 系统注解
- 表格:系统注解
- @Override
- @Deprecated
- @SuppressWarnnings
- 使用在类名上的注解
- 表格:使用在类名上的注解
- @RestController
- @Controller
- @Service
- @Repository
- @Component
- @Configuration
- @Resource
- @Autowired
- @RequestMapping
- @GetMapping
- @PostMapping
- @Transactional
- @Qualifier
- 使用在方法上的注解
- 表格:使用在方法上的注解
- @RequestBody
- @PathVariable
- @Bean
- @ResponseBody
- @PreAuthorize
- 其他常用注解
- 表格:其他常用注解
- @EnableAutoConfiguration
- @SpringBootApplication
- @EnableScheduling
- @EnableAsync
- @ComponentScan
- @Aspec
- @ControllerAdvice
- @ExceptionHandler
- @Value
- @ConfigurationProperties
- @EnableConfigurationProperties
- @MapperScan
- @ApiOperation
- @Produces
- Validator验证的常用注解
- spring IoC容器
- Spring IoC容器依赖注入实现方式
- 常用依赖
- RESTEasy
- resteasy简介
- RESTEasy框架(依赖)的功能和常用注解
- MyBatis
- 简介
- paginationInterceptor
- @TableName
- @TableId
- @Param
- MyBatis-Plus
- MyBatis-Plus简介
- MyBatis-Plus的工具类
- Mybatis-Plus扩展的工具类和方法
- MyBatis-Plus中最常用的工具类方法
- MyBatis-Plus 中最常用的 4 大核心工具类
- Wrapper条件构造器
- Wrapper条件构造器详解
- Wrapper条件构造器eq等方法的参数说明
- LambdaQueryWrapper与QueryWrapper
- 日期格式是否必须转换
- Lombok
- Lombok作用详解
- @Data
- @Slf4j
- @Builder
- @EqualsAndHashCode
- @Accessors
- Jackson
- Jackson简介
- @JsonFormat
- Jackson高效地在 HashMap 和 JSON 字符串之间进行相互转换
- Hutool
- Hutool简介
- hutool依赖常用的方法
- fastjson2
- fastjson2简介
- UrlBasedCorsConfigurationSource
- 生态相关
- JBoss 社区
- 支付系统
- 1. 初始化mysql数据库流程
- 2. 初始化redis数据库的流程
- 3. 初始化rabbitmq服务
- 环球置业
- 1.模块目录结构分析
- 2. DTO(数据传输层)的核心作用
- 3. VO(视图对象层)
- 4. VO(视图对象层)和 DTO 数据传输层 的区别
